Использование списков как множеств
Список может представлять неупорядоченное математическое множество — просто рассмотрите значение как элемент множества, если оно встречается в списке, и игнорируйте порядок списка. Для формирования объединения двух множеств используйте append (если вас не смущает наличие дублирующих элементов). Вы можете удалить equal дубликаты, используя delete-dups или seq-uniq. Другие полезные функции для множеств включают memq и delq, а также их equal версии, member и delete.
Примечание для Common Lisp: Common Lisp имеет функции
union(которая избегает дублирующих элементов) иintersectionдля операций над множествами. В Emacs Lisp аналогичные возможности предоставляются библиотекой cl-lib. См. Списки как множества в Расширения Common Lisp.
- Функция: memq объект список
-
Эта функция проверяет, является ли объект элементом списка. Если это так,
memqвозвращает список, начинающийся с первого вхождения объекта. В противном случае, она возвращаетnil. Буква «q» вmemqговорит о том, что она используетeqдля сравнения объекта с элементами списка. Например:(memq 'b '(a b c b a)) ⇒ (b c b a)(memq '(2) '((1) (2))) ; The two
(2)s need not beeq. ⇒ Unspecified; might benilor((2)).
- Функция: delq объект список
-
Эта функция деструктивно удаляет все элементы
eqдо объекта из списка и возвращает полученный список. Буква «q» вdelqговорит о том, что она используетeqдля сравнения объекта с элементами списка, как вmemqиremq.Как правило, при вызове
delq, вы должны использовать возвращаемое значение, присваивая его переменной, которая содержала исходный список. Причина этого объясняется ниже.
Функция delq удаляет элементы из начала списка, просто перемещаясь по списку и возвращая подсписок, начинающийся после этих элементов. Например:
(delq 'a '(a b c)) ≡ (cdr '(a b c))
Когда удаляемый элемент встречается посередине списка, удаление его включает изменение CDR (см. Setcdr).
(setq sample-list (list 'a 'b 'c '(4)))
⇒ (a b c (4))
(delq 'a sample-list)
⇒ (b c (4))
sample-list
⇒ (a b c (4))
(delq 'c sample-list)
⇒ (a b (4))
sample-list
⇒ (a b (4))
Обратите внимание, что (delq 'c sample-list) изменяет sample-list для вырезания третьего элемента, но (delq 'a sample-list) ничего не вырезает — она просто возвращает более короткий список. Не предполагайте, что переменная, которая ранее содержала аргумент список, теперь содержит меньше элементов или что она все еще содержит исходный список! Сохраните результат delq и используйте его. Чаще всего мы сохраняем результат обратно в переменную, которая содержала исходный список:
(setq flowers (delq 'rose flowers))
В следующем примере, (list 4) , которое delq пытается сопоставить, и (4) в sample-list являются equal, но не eq:
(delq (list 4) sample-list)
⇒ (a c (4))
Если вы хотите удалить элементы, которые equal заданному значению, используйте delete (см. ниже).
- Функция: remq объект список
-
Эта функция возвращает копию списка, из которого удалены все элементы,
eqдо объекта. Буква «q» вremqговорит о том, что она используетeqдля сравнения объекта с элементамиlist.(setq sample-list (list 'a 'b 'c 'a 'b 'c)) ⇒ (a b c a b c)(remq 'a sample-list) ⇒ (b c b c)sample-list ⇒ (a b c a b c)
- Функция: memql объект список
-
Функция
memqlпроверяет, является ли объект элементом списка, сравнивая члены с объектом с помощьюeql, поэтому элементы с плавающей запятой сравниваются по значению. Если объект является членом,memqlвозвращает список, начинающийся с его первого вхождения в список. В противном случае, она возвращаетnil.Сравните это с
memq:(memql 1.2 '(1.1 1.2 1.3)) ;1.2and1.2areeql. ⇒ (1.2 1.3)(memq 1.2 '(1.1 1.2 1.3)) ; The two
1.2s need not beeq. ⇒ Unspecified; might benilor(1.2 1.3).
Следующие три функции похожи на memq, delq и remq, но используют equal вместо eq для сравнения элементов. См. Предикаты равенства.
- Функция: member объект список
-
Функция
memberпроверяет, является ли объект элементом списка, сравнивая члены с объектом с помощьюequal. Если объект является членом,memberвозвращает список, начинающийся с его первого вхождения в список. В противном случае, она возвращаетnil.Сравните это с
memq:(member '(2) '((1) (2))) ;(2)and(2)areequal. ⇒ ((2))(memq '(2) '((1) (2))) ; The two
(2)s need not beeq. ⇒ Unspecified; might benilor(2).;; Two strings with the same contents areequal. (member "foo" '("foo" "bar")) ⇒ ("foo" "bar")
- Функция: delete объект последовательность
-
Эта функция удаляет все элементы
equalдо объекта из последовательности и возвращает полученную последовательность.Если последовательность является списком,
deleteкdelqтак же, какmemberкmemq: она используетequalдля сравнения элементов с объектом, как вmember; когда она находит совпадающий элемент, она вырезает его точно так же, как иdelq. Как и в случае сdelq, вы обычно должны использовать возвращаемое значение, присваивая его переменной, которая содержала исходный список.Если последовательность является вектором или строкой,
deleteвозвращает копиюsequenceс удаленными всеми элементами,equalдоobject.Например:
(setq l (list '(2) '(1) '(2))) (delete '(2) l) ⇒ ((1)) l ⇒ ((2) (1)) ;; If you want to changelreliably, ;; write(setq l (delete '(2) l)).(setq l (list '(2) '(1) '(2))) (delete '(1) l) ⇒ ((2) (2)) l ⇒ ((2) (2)) ;; In this case, it makes no difference whether you setl, ;; but you should do so for the sake of the other case.(delete '(2) [(2) (1) (2)]) ⇒ [(1)]
- Функция: remove объект последовательность
-
Эта функция является неразрушающим аналогом
delete. Она возвращает копиюsequence, списка, вектора или строки, с удаленными элементами,equalдоobject. Например:(remove '(2) '((2) (1) (2))) ⇒ ((1))(remove '(2) [(2) (1) (2)]) ⇒ [(1)]
Примечание для Common Lisp: Функции
member,deleteиremoveв GNU Emacs Lisp взяты из Maclisp, а не из Common Lisp. Версии Common Lisp не используютequalдля сравнения элементов.
- Функция: member-ignore-case объект список
Эта функция похожа на
member, за исключением того, что объект должен быть строкой, и она игнорирует различия в регистре букв и представлении текста: прописные и строчные буквы считаются равными, а однобайтовые строки преобразуются в многобайтовые перед сравнением.
- Функция: delete-dups список
Эта функция деструктивно удаляет все
equalдубликаты из списка, сохраняет результат в списке и возвращает его. Из несколькихequalвхождений элемента в списке,delete-dupsсохраняет первое. См.seq-uniqдля неразрушающей операции (см. Функции последовательностей).
См. также функцию add-to-list, в Переменные списков, для способа добавления элемента в список, хранящийся в переменной и используемый как множество.
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/Sets-And-Lists.html