Common Lisp Extensions
11.3 Lists as Sets
These functions perform operations on lists which represent sets
of elements.
- Function: member* item list &key :test :test-not :key
- This function searches list for an element matching item.
If a match is found, it returns the cons cell whose
car was
the matching element. Otherwise, it returns nil. Elements
are compared by eql by default; you can use the :test,
:test-not, and :key arguments to modify this behavior.
See section 10. Sequences.
Note that this function's name is suffixed by `*' to avoid
the incompatible member function defined in Emacs.
(That function uses equal for comparisons; it is equivalent
to (member* item list :test 'equal).)
The member-if and member-if-not functions
analogously search for elements which satisfy a given predicate.
- Function: tailp sublist list
- This function returns
t if sublist is a sublist of
list, i.e., if sublist is eql to list or to
any of its cdrs.
- Function: adjoin item list &key :test :test-not :key
- This function conses item onto the front of list,
like
(cons item list), but only if item
is not already present on the list (as determined by member*).
If a :key argument is specified, it is applied to
item as well as to the elements of list during
the search, on the reasoning that item is "about" to
become part of the list.
- Function: union list1 list2 &key :test :test-not :key
- This function combines two lists which represent sets of items,
returning a list that represents the union of those two sets.
The result list will contain all items which appear in list1
or list2, and no others. If an item appears in both
list1 and list2 it will be copied only once. If
an item is duplicated in list1 or list2, it is
undefined whether or not that duplication will survive in the
result list. The order of elements in the result list is also
undefined.
- Function: nunion list1 list2 &key :test :test-not :key
- This is a destructive version of
union; rather than copying,
it tries to reuse the storage of the argument lists if possible.
- Function: intersection list1 list2 &key :test :test-not :key
- This function computes the intersection of the sets represented
by list1 and list2. It returns the list of items
which appear in both list1 and list2.
- Function: nintersection list1 list2 &key :test :test-not :key
- This is a destructive version of
intersection. It
tries to reuse storage of list1 rather than copying.
It does not reuse the storage of list2.
- Function: set-difference list1 list2 &key :test :test-not :key
- This function computes the "set difference" of list1
and list2, i.e., the set of elements that appear in
list1 but not in list2.
- Function: nset-difference list1 list2 &key :test :test-not :key
- This is a destructive
set-difference, which will try
to reuse list1 if possible.
- Function: set-exclusive-or list1 list2 &key :test :test-not :key
- This function computes the "set exclusive or" of list1
and list2, i.e., the set of elements that appear in
exactly one of list1 and list2.
- Function: nset-exclusive-or list1 list2 &key :test :test-not :key
- This is a destructive
set-exclusive-or, which will try
to reuse list1 and list2 if possible.
- Function: subsetp list1 list2 &key :test :test-not :key
- This function checks whether list1 represents a subset
of list2, i.e., whether every element of list1
also appears in list2.