我正在编写一个函数replaceFirst(X Y L)
,它仅将列表 L 中第一次出现的 X 替换为 Y。
这是我到目前为止所做的:
(define replaceFirst( lambda (X Y L)
(cond
( (null? L) '() )
( (equal? (car L) X) (set! Y (cdr L)) )
( #t (replaceFirst X Y (cdr L)) )
)
))
这给出了一个错误In procedure setter: Wrong type argument in position 1: #<procedure car (_)>
编辑
我想出了一个解决方案:
首先,如果X
是第一个元素,而不是使用set!
(我不熟悉),我cons
Y
将列表排除在外X
。
否则,我cons
将列表的第一个元素与列表的其余部分递归调用的函数。
(define replaceFirst( lambda (X Y L)
(cond
( (null? L) '() )
( (equal? (car L) X) (cons Y (cdr L)) )
( #t (cons (car L) (replaceFirst X Y (cdr L))) )
)
))