替换列表中

时间:2016-03-31 13:35:05

标签: list functional-programming scheme lisp sisc

我正在编写一个函数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到列表中除{{1} }}。

否则,我X列表的第一个元素,在列表的其余部分递归调用该函数。

cons

1 个答案:

答案 0 :(得分:0)

在你的条款中:

( (equal? (car L) X)    (set! Y (cdr L)) )

该功能实际上返回了什么?如果Y应该是X的替代品,一旦你知道(车辆L)等于 X ,那么将变量Y的值设置为什么列表的其余部分适合您吗?

您的更新很好,但请注意它会返回一个像一样的列表,但是第一次出现的X已被Y替换。它不是同一个列表。这可能没什么问题,但是在你的第一次尝试中使用 set!表明你可能想要修改作为输入传入的列表。