2.4.6.1 点对可视化

列表可以可视化成由点对构成的结构,就像多米诺骨牌。(Lisp 读取器读不懂这样的图,但是可以读懂文本记号。)下面的这个图就表示了一个包含 3 个元素的列表 ( rose violet buttercup):

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
      --> rose     --> violet   --> buttercup

在上图中,每个格子表示一个槽,而这个槽可以指向一个 Lisp 对象。每对格子(就是两个格子)表示一个点对。其中的箭头表示这个槽指向某个 Lisp 对象。被指的对象只能是原子或另一个点对。

在这个例子里,第一个格子,也就是第一个点对的 CAR 位置,指向(或者说储存)rose(一个符号)。而第二个格子,也就是第一个点对的 CDR 位置,指向了另一对格子,也就是第二个点对。第二个点对的 CAR 指向 violet,而 CDR 指向了第三个点对。第三个(也就是最后一个)点对的 CDR 指向 nil。

这里有这个列表的另一种可视化图:

 ---------------       ----------------       -------------------
| car   | cdr   |     | car    | cdr   |     | car       | cdr   |
| rose  |   o-------->| violet |   o-------->| buttercup |  nil  |
|       |       |     |        |       |     |           |       |
 ---------------       ----------------       -------------------

没有任何元素的列表称为空列表。空列表本质上和 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 |
            |       |      |     |         |      |
             --------------       ----------------

最后更新于