Ósc*_*pez 25
这个原语cons
简单地将两个东西粘在一起,其中一些东西被认为是列表是偶然的.例如,这可以工作并创建一对(也称为cons单元格):
(cons 1 2)
=> '(1 . 2) ; a pair
Run Code Online (Sandbox Code Playgroud)
现在,如果第二个参数cons
恰好是一个列表,那么结果将是一个新列表,并且第一个参数cons
将添加到旧列表的头部.换句话说:要创建列表,您需要一个列表,即使它是空的:
(cons 1 '(2 3))
=> '(1 2 3) ; a list
(cons 1 (cons 2 '()))
=> '(1 2) ; a list
(cons 1 '())
=> '(1) ; a list
Run Code Online (Sandbox Code Playgroud)
但是,如果第二个参数cons
是不是一个名单,那么结果将只是一个对,或不适当的列表,这意味着它不会结束'()
,因为它应该被视为一个列表:
(cons '(1 2) 3)
=> '((1 2) . 3) ; a pair, not a list
(cons 1 (cons 2 3))
=> '(1 2 . 3) ; an improper list
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,您不能使用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)
Run Code Online (Sandbox Code Playgroud)
对于那些需要在最后添加一个元素的罕见场合(相信我,这样做通常意味着你认为算法错误)你可以使用append
,它接收两个列表作为参数:
(append '(1 2 3) '(4))
=> '(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)