11

使用 cons 将元素组合到列表和使用 cons 将列表组合到方案中的元素有什么区别?

此外, cons 究竟是如何工作的?它将元素添加到列表的末尾还是开头?

谢谢!

4

1 回答 1

27

原语cons只是将两个东西粘在一起,其中一些东西被认为是列表的事实是偶然的。例如,这可以工作并创建一(也称为cons cell):

(cons 1 2)
=> '(1 . 2)     ; a pair

现在,如果 to 的第二个参数cons恰好是一个列表,那么结果将是一个新列表,并且第一个参数 tocons将被添加到旧列表的开头。换句话说:要创建一个列表,您需要一个列表,即使它是空的:

(cons 1 '(2 3))
=> '(1 2 3)     ; a list

(cons 1 (cons 2 '()))
=> '(1 2)       ; a list

(cons 1 '())
=> '(1)         ; a list

但是如果 to 的第二个参数cons不是一个列表,那么结果将只是一个对,或者一个不正确的 list,这意味着它不会'()以应该被视为一个列表的方式结束:

(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,它接收两个列表作为参数:

(append '(1 2 3) '(4))
=> '(1 2 3 4)
于 2013-10-06T20:48:24.723 回答