Spec-Zone.ru › Elisp

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

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

Макрокоманда: 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

Spec-Zone.ru

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