0

我对如何将我从assoc程序中获得的列表附加到另一个列表中有点困惑,这就是我所拥有的:

(define new-list (list 'test))
(define source-a (list '(a foo) '(b bar) '(c hello)))
(append new-list (assoc 'a source-a))
(display new-list)

输出只是(test),我不确定为什么不是(test a foo)。可以这样追加吗?

4

1 回答 1

2

那是因为append不是一个变异函数。它返回一个列表,其参数附加在一起。按照 Scheme 中的约定,执行突变的函数以感叹号结尾,例如set!.

可以使用set!来修改new-list以使其更新,如下所示:

(set! new-list (append new-list (assoc 'a source-a)))

然而,这在 Scheme 中是非常不鼓励的。虽然命令式编程大量使用突变,但函数式编程语言(包括 Scheme)试图避免突变和副作用,因为这些会使程序更难推理。

理想情况下,您只需使用新值声明一个新绑定,而不是更新现有绑定。像这样的东西会很好用:

(define original-list (list 'test))
(define source-a (list '(a foo) '(b bar) '(c hello)))
(define new-list (append original-list (assoc 'a source-a)))
(display new-list)
于 2015-03-10T11:47:08.660 回答