cl: Lists as Sets

 
 10.3 Lists as Sets
 ==================
 
 These functions perform operations on lists that represent sets of
 elements.
 
  -- Function: cl-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.  SeeSequences.
 
      The standard Emacs lisp function ‘member’ uses ‘equal’ for
      comparisons; it is equivalent to ‘(cl-member ITEM LIST :test
      'equal)’.  With no keyword arguments, ‘cl-member’ is equivalent to
      ‘memq’.
 
    The ‘cl-member-if’ and ‘cl-member-if-not’ functions analogously
 search for elements that satisfy a given predicate.
 
  -- Function: cl-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: cl-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 ‘cl-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: cl-union list1 list2 &key :test :test-not :key
      This function combines two lists that represent sets of items,
      returning a list that represents the union of those two sets.  The
      resulting list contains all items that appear in LIST1 or LIST2,
      and no others.  If an item appears in both LIST1 and LIST2 it is
      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: cl-nunion list1 list2 &key :test :test-not :key
      This is a destructive version of ‘cl-union’; rather than copying,
      it tries to reuse the storage of the argument lists if possible.
 
  -- Function: cl-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 that appear in both
      LIST1 and LIST2.
 
  -- Function: cl-nintersection list1 list2 &key :test :test-not :key
      This is a destructive version of ‘cl-intersection’.  It tries to
      reuse storage of LIST1 rather than copying.  It does _not_ reuse
      the storage of LIST2.
 
  -- Function: cl-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: cl-nset-difference list1 list2 &key :test :test-not :key
      This is a destructive ‘cl-set-difference’, which will try to reuse
      LIST1 if possible.
 
  -- Function: cl-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: cl-nset-exclusive-or list1 list2 &key :test :test-not :key
      This is a destructive ‘cl-set-exclusive-or’, which will try to
      reuse LIST1 and LIST2 if possible.
 
  -- Function: cl-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.