Изменение переменных списков
Эти функции и одна макрокоманда предоставляют удобные способы изменения списка, хранящегося в переменной.
- Макрокоманда: push элемент имя_списка
-
Эта макрокоманда создаёт новый список, у которого CAR — это элемент, а CDR — это список, указанный имя_списка, и сохраняет этот список в имя_списка. В простейшем случае имя_списка — это необрамлённый символ, обозначающий список, и эта макрокоманда эквивалентна
(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 символ элемент &optional append compare-fn
-
Эта функция устанавливает переменную символ, присоединяя к старому значению элемент, если элемент ещё не является членом этого значения. Она возвращает результирующий список, обновлённый или нет. Значение символ должно быть списком до вызова.
add-to-listиспользует compare-fn для сравнения элемент с существующими членами списка; если compare-fn — этоnil, она используетequal.Обычно, если элемент добавляется, он добавляется в начало символ, но если необязательный аргумент append не
nil, он добавляется в конец.Аргумент символ не неявно заключает в кавычки;
add-to-list— обычная функция, какsetи в отличие отsetq. Заключите аргумент в кавычки, если это необходимо.Не используйте эту функцию, когда символ ссылается на лексическую переменную.
Вот пример, показывающий, как использовать 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 символ элемент &optional order
-
Эта функция устанавливает переменную символ, вставляя элемент в старое значение, которое должно быть списком, в позицию, указанную order. Если элемент уже является членом списка, его позиция в списке корректируется в соответствии с order. Принадлежность проверяется с помощью
eq. Эта функция возвращает результирующий список, обновлённый или нет.order обычно является числом (целым или вещественным), и элементы списка сортируются в порядке неубывания.
order также может быть опущен или
nil. В этом случае числовой порядок элемент остаётся неизменным, если он уже есть; в противном случае элемент не имеет числового порядка. Элементы без числового порядка списка помещаются в конец списка в произвольном порядке.Любое другое значение для order удаляет числовой порядок элемент, если он уже есть; в противном случае это эквивалентно
nil.Аргумент символ не неявно заключает в кавычки;
add-to-ordered-list— обычная функция, какsetи в отличие отsetq. Заключите аргумент в кавычки, если необходимо.Информация о порядке хранится в хеш-таблице в свойстве
list-orderсимвол. символ не может ссылаться на лексическую переменную.
Вот пример, показывающий, как использовать 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/List-Variables.html