A list can represent an unordered mathematical set—simply consider a
value an element of a set if it appears in the list, and ignore the
order of the list. To form the union of two sets, use append (as
long as you don't mind having duplicate elements). Other useful
functions for sets include memq and delq, and their
equal versions, member and delete.
Common Lisp note: Common Lisp has functionsunion(which avoids duplicate elements) andintersectionfor set operations, but SXEmacs Lisp does not have them. You can write them in Lisp if you wish.
This function tests to see whether object is a member of list. If it is,
memqreturns a list starting with the first occurrence of object. Otherwise, it returnsnil. The letter ‘q’ inmemqsays that it useseqto compare object against the elements of the list. For example:(memq 'b '(a b c b a)) ⇒ (b c b a) (memq '(2) '((1) (2))) ;(2)and(2)are noteq. ⇒ nil
This function destructively removes all elements
eqto object from list. The letter ‘q’ indelqsays that it useseqto compare object against the elements of the list, likememq.
When delq deletes elements from the front of the list, it does so
simply by advancing down the list and returning a sublist that starts
after those elements:
(delq 'a '(a b c)) == (cdr '(a b c))
When an element to be deleted appears in the middle of the list, removing it involves changing the cdrs (see Setcdr).
(setq sample-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))
Note that (delq 'c sample-list) modifies sample-list to
splice out the third element, but (delq 'a sample-list) does not
splice anything—it just returns a shorter list. Don't assume that a
variable which formerly held the argument list now has fewer
elements, or that it still holds the original list! Instead, save the
result of delq and use that. Most often we store the result back
into the variable that held the original list:
(setq flowers (delq 'rose flowers))
In the following example, the (4) that delq attempts to match
and the (4) in the sample-list are not eq:
(delq '(4) sample-list)
⇒ (a c (4))
The following two functions are like memq and delq but use
equal rather than eq to compare elements. They are new in
Emacs 19.
The function
membertests to see whether object is a member of list, comparing members with object usingequal. If object is a member,memberreturns a list starting with its first occurrence in list. Otherwise, it returnsnil.Compare this with
memq:(member '(2) '((1) (2))) ;(2)and(2)areequal. ⇒ ((2)) (memq '(2) '((1) (2))) ;(2)and(2)are noteq. ⇒ nil ;; Two strings with the same contents areequal. (member "foo" '("foo" "bar")) ⇒ ("foo" "bar")
This function destructively removes all elements
equalto object from list. It is todelqasmemberis tomemq: it usesequalto compare elements with object, likemember; when it finds an element that matches, it removes the element just asdelqwould. For example:(delete '(2) '((2) (1) (2))) ⇒ '((1))
Common Lisp note: The functionsmemberanddeletein SXEmacs Lisp are derived from Maclisp, not Common Lisp. The Common Lisp versions do not useequalto compare elements.
See also the function add-to-list, in Setting Variables,
for another way to add an element to a list stored in a variable.