cons cell是一个具有两个槽的对象,分别称为car槽和cdr槽。每个槽都可以持有或指向任意Lisp对象。我们也用 “这个cons cell的car”来指代该对象car槽持有的任意对象,对于cdr槽持有的对象相似,可做相似称呼。
C程序员注意:在Lisp中,我们并不区分“持有”一个值和“引用”该值,因为在Lisp中,指针是隐式的。
表是一系列的cons cell,依次通过cdr链接在一起,每个cons cell的cdr槽或者引用下一个cons cell,或者
引用空表。对于那些操作表的函数,空表实际上是符号nil。(请参考See 列表.)因为大部分cons cell都作为表的
一部分,因此短语表结构被用来指代任何由cons cell组成的结构(译注:这里隐含着半句话,即“以便用来和表做区分”)。
由于cons cell们对于表如此重要,我们也有这样一个说法,即“不是cons cell的对象”,这些对象被称为原子。
表的读取语法和打印表示是相等的,并且包含一个左括号,任意数量的元素以及一个右括号。以下是表的例子:
(A 2 "A") ; 具有三个元素的表。 () ; 没有元素的表(空表)。 nil ; 没有元素的表(空表)。 ("A ()") ; 具有一个元素的表,元素是:"A ()"。 (A ()) ; 具有两个元系的空表,元素是:A和空表。 (A nil) ; 同上。 ((A B C)) ; 具有一个元素的表,表的元素是 ; 一个具有三个元素的表。
在读取时,括号内的每个对象都变成表的一个元素。也就是说,cons cell由各个元素组成。car槽持有一个元素,其cdr引用
表中的下一个cons cell,该cons cell持有表的下一个元素。表中最后个cons cell的cdr被设置为nil。
car和cdr从Lisp的历史演变而来。原始的Lisp实现运行在一个IBM 704计算机上,该计算机被分为两部分,分别叫作“地址”部分和
“剩余”部分;car是用于取得寄存器地址部分对应内容的指令,而cdr则是用于取得寄存器剩余部分对应内容的指令。相比之下,“cons cells”用于命名
创建它的函数cons,即如其名所识,construction of cells。(译注:这句不翻译,否则不易理解cons cells的意义)