列表可以用图示来表示:把每个 cons 单元画成一对像多米诺骨牌一样的方框。(Lisp 读取器无法理解这种图示;文本表示法既能被人也能被计算机理解,而方框图示只能被人理解。)下图表示含有三个元素的列表 (rose violet buttercup):
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
--> rose --> violet --> buttercup
在这个图示中,每个方框代表一个可以存放或引用任意 Lisp 对象的槽位(slot)。每一对方框代表一个 cons 单元。每一根箭头代表对一个 Lisp 对象的引用,该对象可以是原子,也可以是另一个 cons 单元。
在这个例子里:第一个方框存放第一个 cons 单元的 CAR,引用或存放着符号 rose。第二个方框存放第一个 cons 单元的 CDR,引用下一对方框,也就是第二个 cons 单元。第二个 cons 单元的 CAR 是 violet,它的 CDR 是第三个 cons 单元。第三个(也是最后一个)cons 单元的 CDR 是 nil。
下面是同一个列表 (rose violet buttercup) 的另一种画法:
--------------- ---------------- ------------------- | car | cdr | | car | cdr | | car | cdr | | rose | o-------->| violet | o-------->| buttercup | nil | | | | | | | | | | --------------- ---------------- -------------------
不含任何元素的列表就是 empty list空列表,它和符号 nil 完全等价。换句话说:nil 既是符号,也是列表。
下面是列表 (A ())(等价于 (A nil))的方框箭头图示:
--- --- --- ---
| | |--> | | |--> nil
--- --- --- ---
| |
| |
--> A --> nil
下面是一个更复杂的例子:三元素列表 ((pine needles) oak maple),它的第一个元素本身又是一个双元素列表:
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
| --> oak --> maple
|
| --- --- --- ---
--> | | |--> | | |--> nil
--- --- --- ---
| |
| |
--> pine --> needles
同一个列表用第二种方框表示法画出来是这样:
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| o | o------->| oak | o------->| maple | nil |
| | | | | | | | | |
-- | --------- -------------- --------------
|
|
| -------------- ----------------
| | car | cdr | | car | cdr |
------>| pine | o------->| needles | nil |
| | | | | |
-------------- ----------------