在elisp中,
(cons 1 2) `returns`
(1 . 2)
(list 1 2) `returns`
(1 2)
两个输出之间有什么区别?
答案 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)
如果您有两件事,A
和B
,那么(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)
之间没有功能差异....