Точечная запись пар
Точечная запись пар — это общий синтаксис для ячеек cons, который явно представляет CAR и CDR. В этом синтаксисе (a . b) обозначает ячейку cons, у которой CAR — объект a, а CDR — объект b. Точечная запись пар более общая, чем синтаксис списков, потому что CDR не обязательно должен быть списком. Однако она более громоздка в тех случаях, когда можно использовать синтаксис списков. В точечной записи пар список ‘(1 2 3)’ записывается как ‘(1 . (2 . (3 . nil)))’. Для списков, завершающихся nil, можно использовать любой из этих синтаксисов, но синтаксис списков обычно более понятен и удобен. При выводе списка точечная запись пар используется только в том случае, если CDR ячейки cons не является списком.
Вот пример с использованием прямоугольников для иллюстрации точечной записи пар. Этот пример показывает пару (rose . violet):
--- ---
| | |--> violet
--- ---
|
|
--> rose
Можно комбинировать точечную запись пар со списком, чтобы удобно представить цепочку ячеек cons с не-nil конечным CDR. Вы пишете точку после последнего элемента списка, за которой следует CDR последней ячейки cons. Например, (rose violet
. buttercup) эквивалентно (rose . (violet . buttercup)). Объект выглядит так:
--- --- --- ---
| | |--> | | |--> buttercup
--- --- --- ---
| |
| |
--> rose --> violet
Синтаксис (rose . violet . buttercup) некорректен, потому что он не имеет никакого смысла. В лучшем случае он означал бы размещение buttercup в CDR ячейки cons, CDR которой уже используется для violet.
Список (rose violet) эквивалентен (rose . (violet)), и выглядит так:
--- --- --- ---
| | |--> | | |--> nil
--- --- --- ---
| |
| |
--> rose --> violet
Аналогично, трёхэлементный список (rose violet buttercup) эквивалентен (rose . (violet . (buttercup))). Он выглядит так:
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
--> rose --> violet --> buttercup
Как некоторое побочное следствие того, что (a b . c) и (a . (b . c)) эквивалентны, для соблюдения согласованности это означает, что если вы замените b здесь пустой последовательностью, то (a . c) и (a . ( . c)) тоже будут эквивалентны. Это также означает, что ( . c) эквивалентно c, но это редко используется.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Dotted-Pair-Notation.html