Cons元素列出vs cons列表到Scheme中的元素

时间:2013-10-06 19:37:58

标签: list lisp scheme cons

使用cons将元素组合到列表中并使用cons将列表组合到scheme中的元素之间有什么区别?

此外,利弊究竟如何?它是否将元素添加到列表的末尾或开头?

谢谢!

1 个答案:

答案 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)