Spec-Zone.ru › Elisp

Синтаксис чтения для циклических объектов

Для представления общих или циклических структур внутри сложного лисп-объекта, вы можете использовать конструкции читателя ‘#n=’ и ‘#n#’.

Используйте #n= перед объектом, чтобы пометить его для последующей ссылки; впоследствии, вы можете использовать #n# для ссылки на тот же объект в другом месте. Здесь n — некоторое целое число. Например, вот как создать список, в котором первый элемент повторяется как третий элемент:

(#1=(a) b #1#)

Это отличается от обычного синтаксиса, такого как этот

((a) b (a))

который приведет к списку, элементы которого первого и третьего выглядят одинаково, но не являются одним и тем же лисп-объектом. Это демонстрирует разницу:

(prog1 nil
  (setq x '(#1=(a) b #1#)))
(eq (nth 0 x) (nth 2 x))
     ⇒ t
(setq x '((a) b (a)))
(eq (nth 0 x) (nth 2 x))
     ⇒ nil

Вы также можете использовать тот же синтаксис для создания циклической структуры, которая появляется как элемент внутри себя. Вот пример:

#1=(a #1#)

Это создает список, второй элемент которого — сам список. Вот как можно увидеть, что это действительно работает:

(prog1 nil
  (setq x '#1=(a #1#)))
(eq x (cadr x))
     ⇒ t

Лисп-принтер может генерировать этот синтаксис для записи циклической и общей структуры в лисп-объекте, если вы присвоите переменной print-circle значение, отличное от nil. См. Переменные вывода.

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/Circular-Objects.html

Spec-Zone.ru

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