Рассмотрим минусы x1
:Emacs Lisp совместно структура и общие ссылки
(setq x1 '(a . (b c))) => (a b c)
или в списке обозначений:
(setq x1 '(a b c)) => (a b c)
и минусы x2
, построенные на x1
:
(setq x2 (cons 'A (cdr x1))) => (A b c)
cons
help (в Emacs) говорит, что функция creat es a новый минус, дает ему аргументы, 'A
и (cdr x1)
, как компоненты и возвращает его. В этом нет ничего, что говорит о том, что жизнь вновь возвращенных минусов будет связана с с ее генерирующими компонентами.
Во всяком случае, если один изменяет копию, x2
, также отправляющая минусы, (a . (b c))
модифицируется:
(setcar (cdr x2) 'B) => B
x2 => (A B c) ; as from the assignment
x1 => (a B c) ; x1 and x2 are linked
Другие примеры функции могут показать связь между x1
и x2
.
(setq x1 '(a . (b c))) => (a b c)
(setq x2 (cons 'A (cdr x1))) => (A b c)
(nreverse x2) => (c b A)
x1 => (a b A)
Я взял этот пример из документации setcar
в Emacs Lisp Reference Manual, в котором говорится, что «минусы ячейка является частью общей структуры» и корд из x1
и x2
упоминается как " общая ссылка»и x1
, x2
графически показано, как (слегка адаптированный):
x1:
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| a | o------->| b | o------->| c | nil |
| | | -->| | | | | |
-------------- | -------------- --------------
|
x2: |
-------------- |
| car | cdr | |
| A | o----
| | |
--------------
Это что-то напоминает указатели C, в том, что корд из x2
не копия, а„точки“в ВСЗ x1
. Ясно, но мне интересно, когда эта ситуация возникает практически, т. Е. , как я могу узнать, указывает ли (элемент) минусы на другой или представляет собой собственную копию? В общем, что (где) является формальным определением общая структура и общие ссылки?
В Справочном руководстве Emacs Lisp нет явного упоминания о них. Фактически поиск «общего» или «ссылки» в своем индексе возвращает (за исключением файлов/веб-ссылок) только косвенную ссылку на «общую структуру, синтаксис чтения», касающийся их представления, а не на то, что они есть.
Любопытный поиск в PDF для «общих» земель, как первое вхождение, в раздел «Чтение синтаксиса для круглых объектов», начиная с «Представлять общие или круговые структуры ...». К сожалению, ранее не упоминаются слова общие и круговые (структуры)! Следующим случаем является упомянутая документация setcar
.
Таким образом, кажется, что есть неявные указатели в Lisp/Elisp, но никто не хочет говорить о них.))
Вводные книги Lisp должны объяснять, как составлены списки из cons-клеток. Ячейка cons в основном представляет собой структуру данных с двумя указателями (минус некоторые оптимизации). Это ничего нового - так было в самом первом Лиспе, более пятидесяти лет назад. Создание списков и другой структуры данных из ячеек cons и функций, которые их используют, лежит в основе Lisp. Похоже, вы хорошо начали. –
@RainerJoswig: Комментировать split: ** Part1 **. Пожалуйста, посмотрите здесь: [psg.com/~dlamkins](http://psg.com/~dlamkins/sl/chapter11.html). «деструктивная функция, такая как NREVERSE * иногда *, изменяет свой аргумент таким образом, что измененный аргумент идентичен результату функции». Иногда? Когда? – antonio
@RainerJoswig: Комментировать split: ** Part2 ** «вы не должны зависеть от побочных эффектов DELETE. [...] Но некоторые макросы, например PUSH и POP, принимают место в качестве аргумента и * организуют обновить * место с правильным значением. " Большое спасибо автору, но документация должна указывать на это с той же ясностью. В документах Emacs не указано, что 'delete' является ненадежным, а' push'/'pop' преуспевает в модификации задействованных объектов. Кроме того, в чем смысл деструктивной функции с побочными эффектами, если вы не можете зависеть от них? они быстрее или меньше потребляют память? – antonio