Spec-Zone.ru › Elisp

Точечная запись пар

Точечная запись пар — это общий синтаксис для ячеек 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API