2.4.6.2 点对表示法

Dotted pair notation点对表示法 是用于 cons 单元的通用语法,会显式表示 CARCDR。在这种语法中,(a . b) 表示一个 cons 单元,其 CAR 为对象 aCDR 为对象 b。点对表示法比列表语法更通用,因为 CDR 不必是列表。但在列表语法适用的场景下,它会显得更繁琐。在点对表示法中,列表 ‘(1 2 3)’ 写作 ‘(1 . (2 . (3 . nil)))’。对于以 nil 结尾的常规列表,两种写法都可以使用,但列表语法通常更清晰、更方便。在打印列表时,只有当某个 cons 单元的 CDR 不是列表时,才会使用点对表示法。

下面是用方框图示说明点对表示法的例子,表示 (rose . violet)

    --- ---
   |   |   |--> violet
    --- ---
     |
     |
      --> rose

你可以将点对表示法与列表语法结合,方便地表示最终 CDR 不为 nil 的 cons 单元链。写法是:在列表最后一个元素后面加一个点,再跟上最后一个 cons 单元的 CDR。例如,(rose violet . buttercup) 等价于 (rose . (violet . buttercup))。 结构如下:

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

语法 (rose . violet . buttercup) 是非法的,因为它没有任何合理含义。如果强行解释,它会试图把 buttercup 放入一个 CDR 已经是 violet 的 cons 单元里。

列表 (rose violet) 等价于 (rose . (violet)),结构如下:

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

同理,三元素列表 (rose violet buttercup) 等价于 (rose . (violet . (buttercup)))。 结构如下:

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

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike