Функции для перестановки списков
Ниже приведены некоторые функции, которые разрушающим образом переупорядочивают списки, изменяя CDR элементов ячеек со списками. Эти функции являются разрушающими, поскольку они изменяют исходные списки, переданные им в качестве аргументов, пересвязывая их ячейки со списками, чтобы сформировать новый список, который является возвращаемым значением.
См. delq, в Множества и списки, для другой функции, которая изменяет ячейки со списками.
- Функция: nconc &rest lists
-
Эта функция возвращает список, содержащий все элементы lists. В отличие от
append(см. Создание списков), lists не копируются. Вместо этого последний CDR каждого из lists изменяется для ссылки на следующий список. Последний из lists не изменяется. Например:(setq x (list 1 2 3)) ⇒ (1 2 3)(nconc x '(4 5)) ⇒ (1 2 3 4 5)x ⇒ (1 2 3 4 5)Поскольку последний аргумент функции
nconcне изменяется, разумно использовать постоянный список, например,'(4 5), как в приведённом примере. По той же причине, последний аргумент не обязательно должен быть списком:(setq x (list 1 2 3)) ⇒ (1 2 3)(nconc x 'z) ⇒ (1 2 3 . z)x ⇒ (1 2 3 . z)Однако другие аргументы (кроме последнего) должны быть изменяемыми списками.
Распространённой ошибкой является использование постоянного списка в качестве не последнего аргумента функции
nconc. Если вы это сделаете, поведение будет неопределённым (см. Собственные самооценивающие формы). Возможно, ваш программа будет изменяться при каждом запуске! Вот что может произойти (хотя это не гарантируется):(defun add-foo (x) ; We want this function to add (nconc '(foo) x)) ;
footo the front of its arg.(symbol-function 'add-foo) ⇒ (lambda (x) (nconc '(foo) x))(setq xx (add-foo '(1 2))) ; It seems to work. ⇒ (foo 1 2)(setq xy (add-foo '(3 4))) ; What happened? ⇒ (foo 1 2 3 4)(eq xx xy) ⇒ t(symbol-function 'add-foo) ⇒ (lambda (x) (nconc '(foo 1 2 3 4) x))
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/Rearrangement.html