Синтаксис чтения для циклических объектов
Для представления общих или циклических структур внутри сложного лисп-объекта, вы можете использовать конструкции читателя ‘#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