将 assoc 中的列表附加到 Scheme 中的另一个列表
Append list from assoc to another list in Scheme
我对如何将从 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)
。可以这样追加吗?
那是因为 append
不是变异函数。它 returns 一个 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)
我对如何将从 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)
。可以这样追加吗?
那是因为 append
不是变异函数。它 returns 一个 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)