Изменение переменных-списков
Эти функции и один макрос предоставляют удобные способы изменения списка, хранящегося в переменной.
- Макрос: push element listname
-
Этот макрос создаёт новый список, у которого CAR — это element, а CDR — список, заданный listname, и сохраняет этот список в listname. В простейшем случае listname — это не заключённый в кавычки символ, обозначающий список, и этот макрос эквивалентен
(setq listname (cons element listname)).(setq l '(a b)) ⇒ (a b) (push 'c l) ⇒ (c a b) l ⇒ (c a b)В более общем случае
listnameможет быть обобщённой переменной. В этом случае макрос выполняет действие, эквивалентное(setf listname (cons element listname)). См. раздел Обобщённые переменные.О макросе
pop, который удаляет первый элемент из списка, см. раздел Доступ к элементам списков.
Две функции изменяют списки, являющиеся значениями переменных.
- Функция: add-to-list symbol element &optional append compare-fn
-
Эта функция задаёт переменную symbol, добавляя element в начало её прежнего значения, если element ещё не входит в это значение. Функция возвращает полученный список независимо от того, был ли он изменён. До вызова значение symbol должно быть списком.
add-to-listиспользует compare-fn для сравнения element с элементами существующего списка; если compare-fn равноnil, используетсяequal.Обычно, если element добавляется, он помещается в начало symbol, но если необязательный аргумент append не равен
nil, элемент помещается в конец.Аргумент symbol не заключается в кавычки неявно;
add-to-list— обычная функция, какset, в отличие отsetq. Если это необходимо, заключите аргумент в кавычки самостоятельно.Эта функция предназначена для добавления элементов в переменные конфигурации, такие как
load-path(см. раздел Поиск библиотек),image-load-path(см. раздел Определение изображений) и т. д. Её код содержит немало специальных проверок для этих случаев и выдаёт соответствующие предупреждения. Поэтому мы не рекомендуем использовать её в программах на Lisp для создания произвольных списков; вместо этого используйтеpush. См. раздел Изменение переменных-списков.Не используйте эту функцию, если symbol указывает на лексическую переменную.
Пример использования add-to-list:
(setq foo '(a b))
⇒ (a b)
(add-to-list 'foo 'c) ;; Add c.
⇒ (c a b)
(add-to-list 'foo 'b) ;; No effect.
⇒ (c a b)
foo ;; foo was changed.
⇒ (c a b)
Эквивалентное выражение для (add-to-list 'var
value) выглядит так:
(if (member value var)
var
(setq var (cons value var)))
- Функция: add-to-ordered-list symbol element &optional order
-
Эта функция задаёт переменную symbol, вставляя element в её прежнее значение, которое должно быть списком, в позицию, заданную order. Если element уже входит в список, его позиция корректируется в соответствии с order. Наличие элемента в списке проверяется с помощью
eq. Функция возвращает полученный список независимо от того, был ли он изменён.Аргумент order обычно является числом (целым или с плавающей точкой), а элементы списка сортируются по возрастанию числового значения.
Аргумент order также может быть опущен или равен
nil. В этом случае числовой порядок element не меняется, если он уже задан; в противном случае element не имеет числового порядка. Элементы без числового порядка в списке помещаются в конец списка в произвольном порядке.Любое другое значение аргумента order удаляет числовой порядок element, если он уже задан; в противном случае это эквивалентно
nil.Аргумент symbol не заключается в кавычки неявно;
add-to-ordered-list— обычная функция, какset, в отличие отsetq. При необходимости заключите аргумент в кавычки самостоятельно.Информация о порядке хранится в хеш-таблице в свойстве
list-orderсимвола symbol. symbol не может указывать на лексическую переменную.
Пример использования add-to-ordered-list:
(setq foo '())
⇒ nil
(add-to-ordered-list 'foo 'a 1) ;; Add a.
⇒ (a)
(add-to-ordered-list 'foo 'c 3) ;; Add c.
⇒ (a c)
(add-to-ordered-list 'foo 'b 2) ;; Add b.
⇒ (a b c)
(add-to-ordered-list 'foo 'b 4) ;; Move b.
⇒ (a c b)
(add-to-ordered-list 'foo 'd) ;; Append d.
⇒ (a c b d)
(add-to-ordered-list 'foo 'e) ;; Add e.
⇒ (a c b e d)
foo ;; foo was changed.
⇒ (a c b e d)
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/List-Variables.html