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

Mar*_*ang 10 lisp scheme list cons

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

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

谢谢!

Ó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)