将FROM中的列表附加到Scheme中的另一个列表

时间:2015-03-10 11:14:53

标签: scheme lisp r5rs

我对如何将我从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)。是否有可能像这样追加?

1 个答案:

答案 0 :(得分:2)

那是因为append不是变异函数。它返回一个 new 列表,其参数附加在一起。按照惯例,在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)