elisp中cons和list函数调用之间的区别

时间:2014-12-27 12:56:41

标签: elisp emacs24

在elisp中,

(cons 1 2) `returns`
(1 . 2)
(list 1 2) `returns`
(1 2)

两个输出之间有什么区别?

4 个答案:

答案 0 :(得分:2)

(cons 1 2)创建一个这样的cons单元格:

---------  
| 1 | 2 |   
---------

Lisp中的列表是一系列利弊细胞。每个单元格car是一个列表元素,其cdr指向链中的下一个单元格;最后一个cdr指向特殊符号nil。所以(list 1 2)创建了一系列这样的利弊细胞:

--------|   --------|
| 1 | ----->| 2 | ----> nil
--------|   --------|

它等同于(cons 1 (cons 2 nil))

答案 1 :(得分:1)

如果您有两件事,AB,那么(eq (car (cons A B)) A)(eq (cdr (cons A B)) B)就是给定的。也就是说,cons构建一个" cons小区" (一对)有两个部分,car部分和cdr部分。

按照惯例,由一个原子和一个空列表组成的对被认为是一个列表。因此,(cons 2 nil)(2)。同样,(list 1 2)会返回与(cons 1 (cons 2 nil))类似的结构(即(1 2))。

答案 2 :(得分:0)

缺点是将第一个元素添加到第二个元素 所以,在您的第一个示例(cons 1 2)中,2是一个元素,因此向其添加1将创建一对(1 . 2)

第二个示例创建一个列表,其中1和2作为该列表的元素

如果它像(cons 1 (list 2))那么现在cons会发现第二个参数是一个列表,结果将是(1 2)

答案 3 :(得分:-2)

@ Barmar的回答很好,但没有谈到他们在一天结束时所做的功能差异...... 例如,

(defvar a (list 1 2))
(car a) `returns`
1
(cdr a) `returns`
(2)

(defvar b (cons 1 2))
(car b) `returns`
1
(cdr b) `returns`
(2)

总之,输出使用量(1 2)(1 . 2)之间没有功能差异....