使用 cons 将元素组合到列表和使用 cons 将列表组合到方案中的元素有什么区别?
此外, cons 究竟是如何工作的?它将元素添加到列表的末尾还是开头?
谢谢!
原语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)