Next: , Previous: 序列类型, Up: 编程类型


2.3.6 Cons Cell和表类型

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

carcdr从Lisp的历史演变而来。原始的Lisp实现运行在一个IBM 704计算机上,该计算机被分为两部分,分别叫作“地址”部分和 “剩余”部分;car是用于取得寄存器地址部分对应内容的指令,而cdr则是用于取得寄存器剩余部分对应内容的指令。相比之下,“cons cells”用于命名 创建它的函数cons,即如其名所识,construction of cells。(译注:这句不翻译,否则不易理解cons cells的意义)