# 2.4.6.2 点对记法

点对记法 是更加通用，正式的点对记法。这种记法显示的声明了 CAR 和 CDR 部分。使用这种语法，(a . b) 表示一个点对，其中 CAR 部分储存 对象 a，CDR 部分储存 对象b。点对记法之所以比列表记法更加通用，是因为 CDR 部分所指的并不一定是列表。不过点对记法通常会更繁琐一些。比如 '(1 2 3)' 会被写成 '(1 . (2 . (3 . nil)))' 。对于 nil 结尾的列表，列表记法通常更加简洁清爽。当你打印一个列表时，当且仅当点对的 CDR 不是列表的时候，Lisp 才会采用点对记法。

这里有一个点对可视化的例子：

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

你还可以把点对记法和列表记法融合起来使用，这样可以很好的展示一个 结尾 CDR 非nil 的点对链。比如，(rose violet . buttercup) 和 (rose . (violet . buttercup))就是等价的。这个列表看起来像这样：

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

不过 (rose . violet . buttercup) 这种记法是不合理的。如果要解释成 buttercup 处在 CDR 位置，那显然是不合理的，因为 CDR 部分已经被 violet 占着了。

列表 (rose violet) 和 这个是等价的 (rose . (violet))，而且它们都像下图这样：

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

类似的，这个包含 3 个元素的列表 (rose violet buttercup) 和 这个是等价的 (rose . (violet . (buttercup)))。它们看起来是这样的：

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

2021-8-19  1:18
