Spec-Zone.ru › Elisp

Изменение переменных-списков

Эти функции и один макрос предоставляют удобные способы изменения списка, хранящегося в переменной.

Макрос: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API