使用cons将元素组合到列表中并使用cons将列表组合到scheme中的元素之间有什么区别?
此外,利弊究竟如何?它是否将元素添加到列表的末尾或开头?
谢谢!
答案 0 :(得分:25)
原始cons
简单地将两件事情联系在一起,其中一些被认为是列表的事实是偶然的。例如,这可以工作并创建对(也称为 cons cell ):
(cons 1 2)
=> '(1 . 2) ; a pair
现在,如果cons
的第二个参数恰好是一个列表,那么结果将是一个新列表,cons
的第一个参数将添加到旧列表的头部。换句话说:要创建列表,您需要一个列表,即使它是空的:
(cons 1 '(2 3))
=> '(1 2 3) ; a list
(cons 1 (cons 2 '()))
=> '(1 2) ; a list
(cons 1 '())
=> '(1) ; a list
但是如果cons
的第二个参数是而不是一个列表,那么结果将只是一对或不正确的列表,这意味着它不会以'()
结尾,因为它应该被视为列表:
(cons '(1 2) 3)
=> '((1 2) . 3) ; a pair, not a list
(cons 1 (cons 2 3))
=> '(1 2 . 3) ; an improper list
为了澄清,您不能使用cons
在列表末尾添加元素。构建列表的常用方法是从右向左,在头部位置反向添加元素 - 比如你要构建列表'(1 2 3)
,然后你必须cons
中的元素订单3 2 1
:
(cons 3 '()) ; list is '(3)
(cons 2 (cons 3 '())) ; list is '(2 3)
(cons 1 (cons 2 (cons 3 '()))) ; list is '(1 2 3)
对于那些需要在最后添加一个元素的罕见场合(并且相信我,这样做通常意味着你认为算法错误)你可以使用append
,它接收 2列出作为参数:
(append '(1 2 3) '(4))
=> '(1 2 3 4)