Dotted pair notation点对表示法 是用于 cons 单元的通用语法,会显式表示 CAR 和 CDR。在这种语法中,(a . b) 表示一个 cons 单元,其 CAR 为对象 a,CDR 为对象 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