2.4.6.1 用方框图示绘制列表

列表可以用图示来表示:把每个 cons 单元画成一对像多米诺骨牌一样的方框。(Lisp 读取器无法理解这种图示;文本表示法既能被人也能被计算机理解,而方框图示只能被人理解。)下图表示含有三个元素的列表 (rose violet buttercup)

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

在这个图示中,每个方框代表一个可以存放或引用任意 Lisp 对象的槽位(slot)。每一对方框代表一个 cons 单元。每一根箭头代表对一个 Lisp 对象的引用,该对象可以是原子,也可以是另一个 cons 单元。

在这个例子里:第一个方框存放第一个 cons 单元的 CAR,引用或存放着符号 rose。第二个方框存放第一个 cons 单元的 CDR,引用下一对方框,也就是第二个 cons 单元。第二个 cons 单元的 CARviolet,它的 CDR 是第三个 cons 单元。第三个(也是最后一个)cons 单元的 CDRnil

下面是同一个列表 (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 |
            |       |      |     |         |      |
             --------------       ----------------

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike