Lists
*****

A list represents a sequence of zero or more elements (which may be any Lisp objects).  The important difference between lists and vectors is that two or more lists can share part of their structure; in addition, you can insert or delete elements in a list without copying the whole list.

Lists and Cons Cells
====================

Lists in Lisp are not a primitive data type; they are built up from cons cells (see Cons Cell Type).  A cons cell is a data object that represents an ordered pair.  That is, it has two slots, and each slot holds, or refers to, some Lisp object.  One slot is known as the CAR, and the other is known as the CDR. (These names are traditional; see Cons Cell Type.)  CDR is pronounced ``could-er''.

We say that ``the CAR of this cons cell is'' whatever object its CAR slot currently holds, and likewise for the CDR.

A list is a series of cons cells ``chained together'', so that each cell refers to the next one.  There is one cons cell for each element of the list.  By convention, the CARs of the cons cells hold the elements of the list, and the CDRs are used to chain the list (this asymmetry between CAR and CDR is entirely a matter of convention; at the level of cons cells, the CAR and CDR slots have similar properties).  Hence, the CDR slot of each cons cell in a list refers to the following cons cell.

Also by convention, the CDR of the last cons cell in a list is nil.  We call such a nil-terminated structure a true list.  In Emacs Lisp, the symbol nil is both a symbol and a list with no elements.  For convenience, the symbol nil is considered to have nil as its CDR (and also as its CAR).

Hence, the CDR of a true list is always a true list.  The CDR of a nonempty true list is a true list containing all the elements except the first.

If the CDR of a list's last cons cell is some value other than nil, we call the structure a dotted list, since its printed representation would use dotted pair notation (see Dotted Pair Notation).  There is one other possibility: some cons cell's CDR could point to one of the previous cons cells in the list. We call that structure a circular list.

For some purposes, it does not matter whether a list is true, circular or dotted.  If a program doesn't look far enough down the list to see the CDR of the final cons cell, it won't care. However, some functions that operate on lists demand true lists and signal errors if given a dotted list.  Most functions that try to find the end of a list enter infinite loops if given a circular list.

Because most cons cells are used as part of lists, we refer to any structure made out of cons cells as a list structure.

Predicates on Lists
===================

The following predicates test whether a Lisp object is an atom, whether it is a cons cell or is a list, or whether it is the distinguished object nil.  (Many of these predicates can be defined in terms of the others, but they are used so often that it is worth having them.)

 -- Function: consp object
     This function returns t if OBJECT is a cons cell, nil otherwise.  nil is not a cons cell, although it is a list.

 -- Function: atom object
     This function returns t if OBJECT is an atom, nil otherwise.  All objects except cons cells are atoms.  The symbol nil is an atom and is also a list; it is the only Lisp object that is both.

          (atom OBJECT) == (not (consp OBJECT))

 -- Function: listp object
     This function returns t if OBJECT is a cons cell or nil.  Otherwise, it returns nil.

          (listp '(1))
               => t

          (listp '())
               => t

 -- Function: nlistp object
     This function is the opposite of listp: it returns t if OBJECT is not a list.  Otherwise, it returns nil.

          (listp OBJECT) == (not (nlistp OBJECT))

 -- Function: null object
     This function returns t if OBJECT is nil, and returns nil otherwise.  This function is identical to not, but as a matter of clarity we use null when OBJECT is considered a list and not when it is considered a truth value (see not in Combining Conditions).

          (null '(1))
               => nil

          (null '())
               => t

Accessing Elements of Lists
===========================

 -- Function: car cons-cell
     This function returns the value referred to by the first slot of the cons cell CONS-CELL.  In other words, it returns the CAR of CONS-CELL.

     As a special case, if CONS-CELL is nil, this function returns nil.  Therefore, any list is a valid argument.  An error is signaled if the argument is not a cons cell or nil.

          (car '(a b c))
               => a

          (car '())
               => nil

 -- Function: cdr cons-cell
     This function returns the value referred to by the second slot of the cons cell CONS-CELL.  In other words, it returns the CDR of CONS-CELL.

     As a special case, if CONS-CELL is nil, this function returns nil; therefore, any list is a valid argument.  An error is signaled if the argument is not a cons cell or nil.

          (cdr '(a b c))
               => (b c)

          (cdr '())
               => nil

 -- Function: car-safe object
     This function lets you take the CAR of a cons cell while avoiding errors for other data types.  It returns the CAR of OBJECT if OBJECT is a cons cell, nil otherwise.  This is in contrast to car, which signals an error if OBJECT is not a list.

          (car-safe OBJECT)
          ==
          (let ((x OBJECT))
            (if (consp x)
                (car x)
              nil))

 -- Function: cdr-safe object
     This function lets you take the CDR of a cons cell while avoiding errors for other data types.  It returns the CDR of OBJECT if OBJECT is a cons cell, nil otherwise. This is in contrast to cdr, which signals an error if OBJECT is not a list.

          (cdr-safe OBJECT)
          ==
          (let ((x OBJECT))
            (if (consp x)
                (cdr x)
              nil))

 -- Macro: pop listname
     This macro provides a convenient way to examine the CAR of a list, and take it off the list, all at once.  It operates on the list stored in LISTNAME.  It removes the first element from the list, saves the CDR into LISTNAME, then returns the removed element.

     In the simplest case, LISTNAME is an unquoted symbol naming a list; in that case, this macro is equivalent to (prog1 (car listname) (setq listname (cdr listname))).

          x
               => (a b c)
          (pop x)
               => a
          x
               => (b c)

     More generally, LISTNAME can be a generalized variable.  In that case, this macro saves into LISTNAME using setf. See Generalized Variables.

     For the push macro, which adds an element to a list, see List Variables.

 -- Function: nth n list
     This function returns the Nth element of LIST.  Elements are numbered starting with zero, so the CAR of LIST is element number zero.  If the length of LIST is N or less, the value is nil.

          (nth 2 '(1 2 3 4))
               => 3

          (nth 10 '(1 2 3 4))
               => nil

          (nth n x) == (car (nthcdr n x))

     The function elt is similar, but applies to any kind of sequence. For historical reasons, it takes its arguments in the opposite order. See Sequence Functions.

 -- Function: nthcdr n list
     This function returns the Nth CDR of LIST.  In other words, it skips past the first N links of LIST and returns what follows.

     If N is zero, nthcdr returns all of LIST.  If the length of LIST is N or less, nthcdr returns nil.

          (nthcdr 1 '(1 2 3 4))
               => (2 3 4)

          (nthcdr 10 '(1 2 3 4))
               => nil

          (nthcdr 0 '(1 2 3 4))
               => (1 2 3 4)

 -- Function: last list &optional n
     This function returns the last link of LIST.  The car of this link is the list's last element.  If LIST is null, nil is returned.  If N is non-nil, the Nth-to-last link is returned instead, or the whole of LIST if N is bigger than LIST's length.

 -- Function: safe-length list
     This function returns the length of LIST, with no risk of either an error or an infinite loop.  It generally returns the number of distinct cons cells in the list.  However, for circular lists, the value is just an upper bound; it is often too large.

     If LIST is not nil or a cons cell, safe-length returns 0.

The most common way to compute the length of a list, when you are not worried that it may be circular, is with length.  See Sequence Functions.

 -- Function: caar cons-cell
     This is the same as (car (car CONS-CELL)).

 -- Function: cadr cons-cell
     This is the same as (car (cdr CONS-CELL)) or (nth 1 CONS-CELL).

 -- Function: cdar cons-cell
     This is the same as (cdr (car CONS-CELL)).

 -- Function: cddr cons-cell
     This is the same as (cdr (cdr CONS-CELL)) or (nthcdr 2 CONS-CELL).

 -- Function: butlast x &optional n
     This function returns the list X with the last element, or the last N elements, removed.  If N is greater than zero it makes a copy of the list so as not to damage the original list.  In general, (append (butlast X N) (last X N)) will return a list equal to X.

 -- Function: nbutlast x &optional n
     This is a version of butlast that works by destructively modifying the cdr of the appropriate element, rather than making a copy of the list.

Building Cons Cells and Lists
=============================

Many functions build lists, as lists reside at the very heart of Lisp. cons is the fundamental list-building function; however, it is interesting to note that list is used more times in the source code for Emacs than cons.

 -- Function: cons object1 object2
     This function is the most basic function for building new list structure.  It creates a new cons cell, making OBJECT1 the CAR, and OBJECT2 the CDR.  It then returns the new cons cell.  The arguments OBJECT1 and OBJECT2 may be any Lisp objects, but most often OBJECT2 is a list.

          (cons 1 '(2))
               => (1 2)

          (cons 1 '())
               => (1)

          (cons 1 2)
               => (1 . 2)

     cons is often used to add a single element to the front of a list.  This is called consing the element onto the list. (There is no strictly equivalent way to add an element to the end of a list.  You can use (append LISTNAME (list NEWELT)), which creates a whole new list by copying LISTNAME and adding NEWELT to its end.  Or you can use (nconc LISTNAME (list NEWELT)), which modifies LISTNAME by following all the CDRs and then replacing the terminating nil.  Compare this to adding an element to the beginning of a list with cons, which neither copies nor modifies the list.) For example:

          (setq list (cons newelt list))

     Note that there is no conflict between the variable named list used in this example and the function named list described below; any symbol can serve both purposes.

 -- Function: list &rest objects
     This function creates a list with OBJECTS as its elements.  The resulting list is always nil-terminated.  If no OBJECTS are given, the empty list is returned.

          (list 1 2 3 4 5)
               => (1 2 3 4 5)

          (list 1 2 '(3 4 5) 'foo)
               => (1 2 (3 4 5) foo)

          (list)
               => nil

 -- Function: make-list length object
     This function creates a list of LENGTH elements, in which each element is OBJECT.  Compare make-list with make-string (see Creating Strings).

          (make-list 3 'pigs)
               => (pigs pigs pigs)

          (make-list 0 'pigs)
               => nil

          (setq l (make-list 3 '(a b)))
               => ((a b) (a b) (a b))
          (eq (car l) (cadr l))
               => t

 -- Function: append &rest sequences
     This function returns a list containing all the elements of SEQUENCES.  The SEQUENCES may be lists, vectors, bool-vectors, or strings, but the last one should usually be a list. All arguments except the last one are copied, so none of the arguments is altered.  (See nconc in Rearrangement, for a way to join lists with no copying.)

     More generally, the final argument to append may be any Lisp object.  The final argument is not copied or converted; it becomes the CDR of the last cons cell in the new list.  If the final argument is itself a list, then its elements become in effect elements of the result list.  If the final element is not a list, the result is a dotted list since its final CDR is not nil as required in a true list.

Here is an example of using append:

     (setq trees '(pine oak))
          => (pine oak)
     (setq more-trees (append '(maple birch) trees))
          => (maple birch pine oak)

     trees
          => (pine oak)
     more-trees
          => (maple birch pine oak)

     (eq trees (cdr (cdr more-trees)))
          => t

You can see how append works by looking at a box diagram.  The variable trees is set to the list (pine oak) and then the variable more-trees is set to the list (maple birch pine oak).  However, the variable trees continues to refer to the original list:

     more-trees                trees
     |                           |
     |     --- ---      --- ---   -> --- ---      --- ---
      --> |   |   |--> |   |   |--> |   |   |--> |   |   |--> nil
           --- ---      --- ---      --- ---      --- ---
            |            |            |            |
            |            |            |            |
             --> maple    -->birch     --> pine     --> oak

An empty sequence contributes nothing to the value returned by append.  As a consequence of this, a final nil argument forces a copy of the previous argument:

     trees
          => (pine oak)

     (setq wood (append trees nil))
          => (pine oak)

     wood
          => (pine oak)

     (eq wood trees)
          => nil

This once was the usual way to copy a list, before the function copy-sequence was invented.  See Sequences Arrays Vectors.

Here we show the use of vectors and strings as arguments to append:

     (append [a b] "cd" nil)
          => (a b 99 100)

With the help of apply (see Calling Functions), we can append all the lists in a list of lists:

     (apply 'append '((a b c) nil (x y z) nil))
          => (a b c x y z)

If no SEQUENCES are given, nil is returned:

     (append)
          => nil

Here are some examples where the final argument is not a list:

     (append '(x y) 'z)
          => (x y . z)
     (append '(x y) [z])
          => (x y . [z])

The second example shows that when the final argument is a sequence but not a list, the sequence's elements do not become elements of the resulting list.  Instead, the sequence becomes the final CDR, like any other non-list final argument.

 -- Function: reverse list
     This function creates a new list whose elements are the elements of LIST, but in reverse order.  The original argument LIST is not altered.

          (setq x '(1 2 3 4))
               => (1 2 3 4)

          (reverse x)
               => (4 3 2 1)
          x
               => (1 2 3 4)

 -- Function: copy-tree tree &optional vecp
     This function returns a copy of the tree tree.  If TREE is a cons cell, this makes a new cons cell with the same CAR and CDR, then recursively copies the CAR and CDR in the same way.

     Normally, when TREE is anything other than a cons cell, copy-tree simply returns TREE.  However, if VECP is non-nil, it copies vectors too (and operates recursively on their elements).

 -- Function: number-sequence from &optional to separation
     This returns a list of numbers starting with FROM and incrementing by SEPARATION, and ending at or just before TO.  SEPARATION can be positive or negative and defaults to 1.  If TO is nil or numerically equal to FROM, the value is the one-element list (FROM).  If TO is less than FROM with a positive SEPARATION, or greater than FROM with a negative SEPARATION, the value is nil because those arguments specify an empty sequence.

     If SEPARATION is 0 and TO is neither nil nor numerically equal to FROM, number-sequence signals an error, since those arguments specify an infinite sequence.

     All arguments are numbers. Floating-point arguments can be tricky, because floating-point arithmetic is inexact.  For instance, depending on the machine, it may quite well happen that (number-sequence 0.4 0.6 0.2) returns the one element list (0.4), whereas (number-sequence 0.4 0.8 0.2) returns a list with three elements.  The Nth element of the list is computed by the exact formula (+ FROM (* N SEPARATION)).  Thus, if one wants to make sure that TO is included in the list, one can pass an expression of this exact type for TO.  Alternatively, one can replace TO with a slightly larger value (or a slightly more negative value if SEPARATION is negative).

     Some examples:

          (number-sequence 4 9)
               => (4 5 6 7 8 9)
          (number-sequence 9 4 -1)
               => (9 8 7 6 5 4)
          (number-sequence 9 4 -2)
               => (9 7 5)
          (number-sequence 8)
               => (8)
          (number-sequence 8 5)
               => nil
          (number-sequence 5 8 -1)
               => nil
          (number-sequence 1.5 6 2)
               => (1.5 3.5 5.5)

Modifying List Variables
========================

These functions, and one macro, provide convenient ways to modify a list which is stored in a variable.

 -- Macro: push element listname
     This macro creates a new list whose CAR is ELEMENT and whose CDR is the list specified by LISTNAME, and saves that list in LISTNAME.  In the simplest case, LISTNAME is an unquoted symbol naming a list, and this macro is equivalent to (setq LISTNAME (cons ELEMENT LISTNAME)).

          (setq l '(a b))
               => (a b)
          (push 'c l)
               => (c a b)
          l
               => (c a b)

     More generally, listname can be a generalized variable.  In that case, this macro does the equivalent of (setf LISTNAME (cons ELEMENT LISTNAME)). See Generalized Variables.

     For the pop macro, which removes the first element from a list, see List Elements.

Two functions modify lists that are the values of variables.

 -- Function: add-to-list symbol element &optional append compare-fn
     This function sets the variable SYMBOL by consing ELEMENT onto the old value, if ELEMENT is not already a member of that value.  It returns the resulting list, whether updated or not.  The value of SYMBOL had better be a list already before the call. add-to-list uses COMPARE-FN to compare ELEMENT against existing list members; if COMPARE-FN is nil, it uses equal.

     Normally, if ELEMENT is added, it is added to the front of SYMBOL, but if the optional argument APPEND is non-nil, it is added at the end.

     The argument SYMBOL is not implicitly quoted; add-to-list is an ordinary function, like set and unlike setq.  Quote the argument yourself if that is what you want.

Here's a scenario showing how to use 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)

An equivalent expression for (add-to-list 'VAR VALUE) is this:

     (or (member VALUE VAR)
         (setq VAR (cons VALUE VAR)))

 -- Function: add-to-ordered-list symbol element &optional order
     This function sets the variable SYMBOL by inserting ELEMENT into the old value, which must be a list, at the position specified by ORDER.  If ELEMENT is already a member of the list, its position in the list is adjusted according to ORDER.  Membership is tested using eq. This function returns the resulting list, whether updated or not.

     The ORDER is typically a number (integer or float), and the elements of the list are sorted in non-decreasing numerical order.

     ORDER may also be omitted or nil.  Then the numeric order of ELEMENT stays unchanged if it already has one; otherwise, ELEMENT has no numeric order.  Elements without a numeric list order are placed at the end of the list, in no particular order.

     Any other value for ORDER removes the numeric order of ELEMENT if it already has one; otherwise, it is equivalent to nil.

     The argument SYMBOL is not implicitly quoted; add-to-ordered-list is an ordinary function, like set and unlike setq.  Quote the argument yourself if necessary.

     The ordering information is stored in a hash table on SYMBOL's list-order property.

Here's a scenario showing how to use 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)

Modifying Existing List Structure
=================================

You can modify the CAR and CDR contents of a cons cell with the primitives setcar and setcdr.  We call these ``destructive'' operations because they change existing list structure.

     Common Lisp note: Common Lisp uses functions rplaca and rplacd to alter list structure; they change structure the same way as setcar and setcdr, but the Common Lisp functions return the cons cell while setcar and setcdr return the new CAR or CDR.

Altering List Elements with setcar
----------------------------------

Changing the CAR of a cons cell is done with setcar.  When used on a list, setcar replaces one element of a list with a different element.

 -- Function: setcar cons object
     This function stores OBJECT as the new CAR of CONS, replacing its previous CAR.  In other words, it changes the CAR slot of CONS to refer to OBJECT.  It returns the value OBJECT.  For example:

          (setq x '(1 2))
               => (1 2)

          (setcar x 4)
               => 4

          x
               => (4 2)

When a cons cell is part of the shared structure of several lists, storing a new CAR into the cons changes one element of each of these lists.  Here is an example:

     ;; Create two lists that are partly shared.
     (setq x1 '(a b c))
          => (a b c)
     (setq x2 (cons 'z (cdr x1)))
          => (z b c)

     ;; Replace the CAR of a shared link.
     (setcar (cdr x1) 'foo)
          => foo
     x1                           ; Both lists are changed.
          => (a foo c)
     x2
          => (z foo c)

     ;; Replace the CAR of a link that is not shared.
     (setcar x1 'baz)
          => baz
     x1                           ; Only one list is changed.
          => (baz foo c)
     x2
          => (z foo c)

Here is a graphical depiction of the shared structure of the two lists in the variables x1 and x2, showing why replacing b changes them both:

             --- ---        --- ---      --- ---
     x1---> |   |   |----> |   |   |--> |   |   |--> nil
             --- ---        --- ---      --- ---
              |        -->   |            |
              |       |      |            |
               --> a  |       --> b        --> c
                      |
            --- ---   |
     x2--> |   |   |--
            --- ---
             |
             |
              --> z

Here is an alternative form of box diagram, showing the same relationship:

     x1:
      --------------       --------------       --------------
     | car   | cdr  |     | car   | cdr  |     | car   | cdr  |
     |   a   |   o------->|   b   |   o------->|   c   |  nil |
     |       |      |  -->|       |      |     |       |      |
      --------------  |    --------------       --------------
                      |
     x2:              |
      --------------  |
     | car   | cdr  | |
     |   z   |   o----
     |       |      |
      --------------

Altering the CDR of a List
--------------------------

The lowest-level primitive for modifying a CDR is setcdr:

 -- Function: setcdr cons object
     This function stores OBJECT as the new CDR of CONS, replacing its previous CDR.  In other words, it changes the CDR slot of CONS to refer to OBJECT.  It returns the value OBJECT.

Here is an example of replacing the CDR of a list with a different list.  All but the first element of the list are removed in favor of a different sequence of elements.  The first element is unchanged, because it resides in the CAR of the list, and is not reached via the CDR.

     (setq x '(1 2 3))
          => (1 2 3)

     (setcdr x '(4))
          => (4)

     x
          => (1 4)

You can delete elements from the middle of a list by altering the CDRs of the cons cells in the list.  For example, here we delete the second element, b, from the list (a b c), by changing the CDR of the first cons cell:

     (setq x1 '(a b c))
          => (a b c)
     (setcdr x1 (cdr (cdr x1)))
          => (c)
     x1
          => (a c)

Here is the result in box notation:

                        --------------------
                       |                    |
      --------------   |   --------------   |    --------------
     | car   | cdr  |  |  | car   | cdr  |   -->| car   | cdr  |
     |   a   |   o-----   |   b   |   o-------->|   c   |  nil |
     |       |      |     |       |      |      |       |      |
      --------------       --------------        --------------

The second cons cell, which previously held the element b, still exists and its CAR is still b, but it no longer forms part of this list.

It is equally easy to insert a new element by changing CDRs:

     (setq x1 '(a b c))
          => (a b c)
     (setcdr x1 (cons 'd (cdr x1)))
          => (d b c)
     x1
          => (a d b c)

Here is this result in box notation:

      --------------        -------------       -------------
     | car  | cdr   |      | car  | cdr  |     | car  | cdr  |
     |   a  |   o   |   -->|   b  |   o------->|   c  |  nil |
     |      |   |   |  |   |      |      |     |      |      |
      --------- | --   |    -------------       -------------
                |      |
          -----         --------
         |                      |
         |    ---------------   |
         |   | car   | cdr   |  |
          -->|   d   |   o------
             |       |       |
              ---------------

Functions that Rearrange Lists
------------------------------

Here are some functions that rearrange lists ``destructively'' by modifying the CDRs of their component cons cells.  We call these functions ``destructive'' because they chew up the original lists passed to them as arguments, relinking their cons cells to form a new list that is the returned value.

See delq, in Sets And Lists, for another function that modifies cons cells.

 -- Function: nconc &rest lists
     This function returns a list containing all the elements of LISTS. Unlike append (see Building Lists), the LISTS are not copied.  Instead, the last CDR of each of the LISTS is changed to refer to the following list.  The last of the LISTS is not altered.  For example:

          (setq x '(1 2 3))
               => (1 2 3)

          (nconc x '(4 5))
               => (1 2 3 4 5)

          x
               => (1 2 3 4 5)

     Since the last argument of nconc is not itself modified, it is reasonable to use a constant list, such as '(4 5), as in the above example.  For the same reason, the last argument need not be a list:

          (setq x '(1 2 3))
               => (1 2 3)

          (nconc x 'z)
               => (1 2 3 . z)

          x
               => (1 2 3 . z)

     However, the other arguments (all but the last) must be lists.

     A common pitfall is to use a quoted constant list as a non-last argument to nconc.  If you do this, your program will change each time you run it!  Here is what happens:

          (defun add-foo (x)            ; We want this function to add
            (nconc '(foo) x))           ;   foo to the front of its arg.

          (symbol-function 'add-foo)
               => (lambda (x) (nconc (quote (foo)) x))

          (setq xx (add-foo '(1 2)))    ; It seems to work.
               => (foo 1 2)

          (setq xy (add-foo '(3 4)))    ; What happened?
               => (foo 1 2 3 4)

          (eq xx xy)
               => t

          (symbol-function 'add-foo)
               => (lambda (x) (nconc (quote (foo 1 2 3 4) x)))

 -- Function: nreverse list
     This function reverses the order of the elements of LIST. Unlike reverse, nreverse alters its argument by reversing the CDRs in the cons cells forming the list.  The cons cell that used to be the last one in LIST becomes the first cons cell of the value.

     For example:

          (setq x '(a b c))
               => (a b c)

          x
               => (a b c)
          (nreverse x)
               => (c b a)

          ;; The cons cell that was first is now last.
          x
               => (a)

     To avoid confusion, we usually store the result of nreverse back in the same variable which held the original list:

          (setq x (nreverse x))

     Here is the nreverse of our favorite example, (a b c), presented graphically:

          Original list head:                       Reversed list:
           -------------        -------------        ------------
          | car  | cdr  |      | car  | cdr  |      | car | cdr  |
          |   a  |  nil |<--   |   b  |   o  |<--   |   c |   o  |
          |      |      |   |  |      |   |  |   |  |     |   |  |
           -------------    |   --------- | -    |   -------- | -
                            |             |      |            |
                             -------------        ------------

 -- Function: sort list predicate
     This function sorts LIST stably, though destructively, and returns the sorted list.  It compares elements using PREDICATE.  A stable sort is one in which elements with equal sort keys maintain their relative order before and after the sort.  Stability is important when successive sorts are used to order elements according to different criteria.

     The argument PREDICATE must be a function that accepts two arguments.  It is called with two elements of LIST.  To get an increasing order sort, the PREDICATE should return non-nil if the first element is ``less than'' the second, or nil if not.

     The comparison function PREDICATE must give reliable results for any given pair of arguments, at least within a single call to sort.  It must be antisymmetric; that is, if A is less than B, B must not be less than A.  It must be transitive---that is, if A is less than B, and B is less than C, then A must be less than C.  If you use a comparison function which does not meet these requirements, the result of sort is unpredictable.

     The destructive aspect of sort is that it rearranges the cons cells forming LIST by changing CDRs.  A nondestructive sort function would create new cons cells to store the elements in their sorted order.  If you wish to make a sorted copy without destroying the original, copy it first with copy-sequence and then sort.

     Sorting does not change the CARs of the cons cells in LIST; the cons cell that originally contained the element a in LIST still has a in its CAR after sorting, but it now appears in a different position in the list due to the change of CDRs.  For example:

          (setq nums '(1 3 2 6 5 4 0))
               => (1 3 2 6 5 4 0)

          (sort nums '<)
               => (0 1 2 3 4 5 6)

          nums
               => (1 2 3 4 5 6)

     Warning: Note that the list in nums no longer contains 0; this is the same cons cell that it was before, but it is no longer the first one in the list.  Don't assume a variable that formerly held the argument now holds the entire sorted list!  Instead, save the result of sort and use that.  Most often we store the result back into the variable that held the original list:

          (setq nums (sort nums '<))

     See Sorting, for more functions that perform sorting. See documentation in Accessing Documentation, for a useful example of sort.

Using Lists as Sets
===================

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).  You can remove equal duplicates using delete-dups.  Other useful functions for sets include memq and delq, and their equal versions, member and delete.

     Common Lisp note: Common Lisp has functions union (which avoids duplicate elements) and intersection for set operations. Although standard GNU Emacs Lisp does not have them, the cl-lib library provides versions. See Lists as Sets (Common Lisp Extensions).

 -- Function: memq object list
     This function tests to see whether OBJECT is a member of LIST.  If it is, memq returns a list starting with the first occurrence of OBJECT.  Otherwise, it returns nil. The letter q in memq says that it uses eq to 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 not eq.
               => nil

 -- Function: delq object list
     This function destructively removes all elements eq to OBJECT from LIST, and returns the resulting list.  The letter q in delq says that it uses eq to compare OBJECT against the elements of the list, like memq and remq.

     Typically, when you invoke delq, you should use the return value by assigning it to the variable which held the original list. The reason for this is explained below.

The delq function deletes elements from the front of the list by simply advancing down the list, and returning a sublist that starts after those elements.  For example:

     (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))

If you want to delete elements that are equal to a given value, use delete (see below).

 -- Function: remq object list
     This function returns a copy of LIST, with all elements removed which are eq to OBJECT.  The letter q in remq says that it uses eq to compare OBJECT against the elements of list.

          (setq sample-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)

 -- Function: memql object list
     The function memql tests to see whether OBJECT is a member of LIST, comparing members with OBJECT using eql, so floating-point elements are compared by value. If OBJECT is a member, memql returns a list starting with its first occurrence in LIST.  Otherwise, it returns nil.

     Compare this with memq:

          (memql 1.2 '(1.1 1.2 1.3))  ; 1.2 and 1.2 are eql.
               => (1.2 1.3)

          (memq 1.2 '(1.1 1.2 1.3))  ; 1.2 and 1.2 are not eq.
               => nil

The following three functions are like memq, delq and remq, but use equal rather than eq to compare elements.  See Equality Predicates.

 -- Function: member object list
     The function member tests to see whether OBJECT is a member of LIST, comparing members with OBJECT using equal. If OBJECT is a member, member returns a list starting with its first occurrence in LIST.  Otherwise, it returns nil.

     Compare this with memq:

          (member '(2) '((1) (2)))  ; (2) and (2) are equal.
               => ((2))

          (memq '(2) '((1) (2)))    ; (2) and (2) are not eq.
               => nil

          ;; Two strings with the same contents are equal.
          (member "foo" '("foo" "bar"))
               => ("foo" "bar")

 -- Function: delete object sequence
     This function removes all elements equal to OBJECT from SEQUENCE, and returns the resulting sequence.

     If SEQUENCE is a list, delete is to delq as member is to memq: it uses equal to compare elements with OBJECT, like member; when it finds an element that matches, it cuts the element out just as delq would.  As with delq, you should typically use the return value by assigning it to the variable which held the original list.

     If sequence is a vector or string, delete returns a copy of sequence with all elements equal to object removed.

     For example:

          (setq l '((2) (1) (2)))
          (delete '(2) l)
               => ((1))
          l
               => ((2) (1))
          ;; If you want to change l reliably,
          ;; write (setq l (delete '(2) l)).

          (setq l '((2) (1) (2)))
          (delete '(1) l)
               => ((2) (2))
          l
               => ((2) (2))
          ;; In this case, it makes no difference whether you set l,
          ;; but you should do so for the sake of the other case.

          (delete '(2) [(2) (1) (2)])
               => [(1)]

 -- Function: remove object sequence
     This function is the non-destructive counterpart of delete.  It returns a copy of sequence, a list, vector, or string, with elements equal to object removed.  For example:

          (remove '(2) '((2) (1) (2)))
               => ((1))

          (remove '(2) [(2) (1) (2)])
               => [(1)]

     Common Lisp note: The functions member, delete and remove in GNU Emacs Lisp are derived from Maclisp, not Common Lisp.  The Common Lisp versions do not use equal to compare elements.

 -- Function: member-ignore-case object list
     This function is like member, except that OBJECT should be a string and that it ignores differences in letter-case and text representation: upper-case and lower-case letters are treated as equal, and unibyte strings are converted to multibyte prior to comparison.

 -- Function: delete-dups list
     This function destructively removes all equal duplicates from LIST, stores the result in LIST and returns it.  Of several equal occurrences of an element in LIST, delete-dups keeps the first one.

See also the function add-to-list, in List Variables, for a way to add an element to a list stored in a variable and used as a set.

Association Lists
=================

An association list, or alist for short, records a mapping from keys to values.  It is a list of cons cells called associations: the CAR of each cons cell is the key, and the CDR is the associated value. (This usage of ``key'' is not related to the term ``key sequence''; it means a value used to look up an item in a table.  In this case, the table is the alist, and the alist associations are the items.)

Here is an example of an alist.  The key pine is associated with the value cones; the key oak is associated with acorns; and the key maple is associated with seeds.

     ((pine . cones)
      (oak . acorns)
      (maple . seeds))

Both the values and the keys in an alist may be any Lisp objects. For example, in the following alist, the symbol a is associated with the number 1, and the string "b" is associated with the list (2 3), which is the CDR of the alist element:

     ((a . 1) ("b" 2 3))

Sometimes it is better to design an alist to store the associated value in the CAR of the CDR of the element.  Here is an example of such an alist:

     ((rose red) (lily white) (buttercup yellow))

Here we regard red as the value associated with rose.  One advantage of this kind of alist is that you can store other related information---even a list of other items---in the CDR of the CDR.  One disadvantage is that you cannot use rassq (see below) to find the element containing a given value.  When neither of these considerations is important, the choice is a matter of taste, as long as you are consistent about it for any given alist.

The same alist shown above could be regarded as having the associated value in the CDR of the element; the value associated with rose would be the list (red).

Association lists are often used to record information that you might otherwise keep on a stack, since new associations may be added easily to the front of the list.  When searching an association list for an association with a given key, the first one found is returned, if there is more than one.

In Emacs Lisp, it is not an error if an element of an association list is not a cons cell.  The alist search functions simply ignore such elements.  Many other versions of Lisp signal errors in such cases.

Note that property lists are similar to association lists in several respects.  A property list behaves like an association list in which each key can occur only once.  See Property Lists, for a comparison of property lists and association lists.

 -- Function: assoc key alist
     This function returns the first association for KEY in ALIST, comparing KEY against the alist elements using equal (see Equality Predicates).  It returns nil if no association in ALIST has a CAR equal to KEY. For example:

          (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
               => ((pine . cones) (oak . acorns) (maple . seeds))
          (assoc 'oak trees)
               => (oak . acorns)
          (cdr (assoc 'oak trees))
               => acorns
          (assoc 'birch trees)
               => nil

     Here is another example, in which the keys and values are not symbols:

          (setq needles-per-cluster
                '((2 "Austrian Pine" "Red Pine")
                  (3 "Pitch Pine")
                  (5 "White Pine")))

          (cdr (assoc 3 needles-per-cluster))
               => ("Pitch Pine")
          (cdr (assoc 2 needles-per-cluster))
               => ("Austrian Pine" "Red Pine")

The function assoc-string is much like assoc except that it ignores certain differences between strings.  See Text Comparison.

 -- Function: rassoc value alist
     This function returns the first association with value VALUE in ALIST.  It returns nil if no association in ALIST has a CDR equal to VALUE.

     rassoc is like assoc except that it compares the CDR of each ALIST association instead of the CAR.  You can think of this as ``reverse assoc'', finding the key for a given value.

 -- Function: assq key alist
     This function is like assoc in that it returns the first association for KEY in ALIST, but it makes the comparison using eq instead of equal.  assq returns nil if no association in ALIST has a CAR eq to KEY. This function is used more often than assoc, since eq is faster than equal and most alists use symbols as keys. See Equality Predicates.

          (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
               => ((pine . cones) (oak . acorns) (maple . seeds))
          (assq 'pine trees)
               => (pine . cones)

     On the other hand, assq is not usually useful in alists where the keys may not be symbols:

          (setq leaves
                '(("simple leaves" . oak)
                  ("compound leaves" . horsechestnut)))

          (assq "simple leaves" leaves)
               => nil
          (assoc "simple leaves" leaves)
               => ("simple leaves" . oak)

 -- Function: rassq value alist
     This function returns the first association with value VALUE in ALIST.  It returns nil if no association in ALIST has a CDR eq to VALUE.

     rassq is like assq except that it compares the CDR of each ALIST association instead of the CAR.  You can think of this as ``reverse assq'', finding the key for a given value.

     For example:

          (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))

          (rassq 'acorns trees)
               => (oak . acorns)
          (rassq 'spores trees)
               => nil

     rassq cannot search for a value stored in the CAR of the CDR of an element:

          (setq colors '((rose red) (lily white) (buttercup yellow)))

          (rassq 'white colors)
               => nil

     In this case, the CDR of the association (lily white) is not the symbol white, but rather the list (white).  This becomes clearer if the association is written in dotted pair notation:

          (lily white) == (lily . (white))

 -- Function: assoc-default key alist &optional test default
     This function searches ALIST for a match for KEY.  For each element of ALIST, it compares the element (if it is an atom) or the element's CAR (if it is a cons) against KEY, by calling TEST with two arguments: the element or its CAR, and KEY.  The arguments are passed in that order so that you can get useful results using string-match with an alist that contains regular expressions (see Regexp Search).  If TEST is omitted or nil, equal is used for comparison.

     If an alist element matches KEY by this criterion, then assoc-default returns a value based on this element. If the element is a cons, then the value is the element's CDR. Otherwise, the return value is DEFAULT.

     If no alist element matches KEY, assoc-default returns nil.

 -- Function: copy-alist alist
     This function returns a two-level deep copy of ALIST: it creates a new copy of each association, so that you can alter the associations of the new alist without changing the old one.

          (setq needles-per-cluster
                '((2 . ("Austrian Pine" "Red Pine"))
                  (3 . ("Pitch Pine"))

                  (5 . ("White Pine"))))
          =>
          ((2 "Austrian Pine" "Red Pine")
           (3 "Pitch Pine")
           (5 "White Pine"))

          (setq copy (copy-alist needles-per-cluster))
          =>
          ((2 "Austrian Pine" "Red Pine")
           (3 "Pitch Pine")
           (5 "White Pine"))

          (eq needles-per-cluster copy)
               => nil
          (equal needles-per-cluster copy)
               => t
          (eq (car needles-per-cluster) (car copy))
               => nil
          (cdr (car (cdr needles-per-cluster)))
               => ("Pitch Pine")

          (eq (cdr (car (cdr needles-per-cluster)))
              (cdr (car (cdr copy))))
               => t

     This example shows how copy-alist makes it possible to change the associations of one copy without affecting the other:

          (setcdr (assq 3 copy) '("Martian Vacuum Pine"))
          (cdr (assq 3 needles-per-cluster))
               => ("Pitch Pine")

 -- Function: assq-delete-all key alist
     This function deletes from ALIST all the elements whose CAR is eq to KEY, much as if you used delq to delete each such element one by one.  It returns the shortened alist, and often modifies the original list structure of ALIST.  For correct results, use the return value of assq-delete-all rather than looking at the saved value of ALIST.

          (setq alist '((foo 1) (bar 2) (foo 3) (lose 4)))
               => ((foo 1) (bar 2) (foo 3) (lose 4))
          (assq-delete-all 'foo alist)
               => ((bar 2) (lose 4))
          alist
               => ((foo 1) (bar 2) (lose 4))

 -- Function: rassq-delete-all value alist
     This function deletes from ALIST all the elements whose CDR is eq to VALUE.  It returns the shortened alist, and often modifies the original list structure of ALIST. rassq-delete-all is like assq-delete-all except that it compares the CDR of each ALIST association instead of the CAR.

Property Lists
==============

A property list (plist for short) is a list of paired elements.  Each of the pairs associates a property name (usually a symbol) with a property or value.  Here is an example of a property list:

     (pine cones numbers (1 2 3) color "blue")

This property list associates pine with cones, numbers with (1 2 3), and color with "blue".  The property names and values can be any Lisp objects, but the names are usually symbols (as they are in this example).

Property lists are used in several contexts.  For instance, the function put-text-property takes an argument which is a property list, specifying text properties and associated values which are to be applied to text in a string or buffer.  See Text Properties.

Another prominent use of property lists is for storing symbol properties.  Every symbol possesses a list of properties, used to record miscellaneous information about the symbol; these properties are stored in the form of a property list.  See Symbol Properties.

Property Lists and Association Lists
------------------------------------

Association lists (see Association Lists) are very similar to property lists.  In contrast to association lists, the order of the pairs in the property list is not significant, since the property names must be distinct.

Property lists are better than association lists for attaching information to various Lisp function names or variables.  If your program keeps all such information in one association list, it will typically need to search that entire list each time it checks for an association for a particular Lisp function name or variable, which could be slow.  By contrast, if you keep the same information in the property lists of the function names or variables themselves, each search will scan only the length of one property list, which is usually short.  This is why the documentation for a variable is recorded in a property named variable-documentation.  The byte compiler likewise uses properties to record those functions needing special treatment.

However, association lists have their own advantages.  Depending on your application, it may be faster to add an association to the front of an association list than to update a property.  All properties for a symbol are stored in the same property list, so there is a possibility of a conflict between different uses of a property name.  (For this reason, it is a good idea to choose property names that are probably unique, such as by beginning the property name with the program's usual name-prefix for variables and functions.)  An association list may be used like a stack where associations are pushed on the front of the list and later discarded; this is not possible with a property list.

Property Lists Outside Symbols
------------------------------

The following functions can be used to manipulate property lists. They all compare property names using eq.

 -- Function: plist-get plist property
     This returns the value of the PROPERTY property stored in the property list PLIST.  It accepts a malformed PLIST argument.  If PROPERTY is not found in the PLIST, it returns nil.  For example,

          (plist-get '(foo 4) 'foo)
               => 4
          (plist-get '(foo 4 bad) 'foo)
               => 4
          (plist-get '(foo 4 bad) 'bad)
               => nil
          (plist-get '(foo 4 bad) 'bar)
               => nil

 -- Function: plist-put plist property value
     This stores VALUE as the value of the PROPERTY property in the property list PLIST.  It may modify PLIST destructively, or it may construct a new list structure without altering the old.  The function returns the modified property list, so you can store that back in the place where you got PLIST.  For example,

          (setq my-plist '(bar t foo 4))
               => (bar t foo 4)
          (setq my-plist (plist-put my-plist 'foo 69))
               => (bar t foo 69)
          (setq my-plist (plist-put my-plist 'quux '(a)))
               => (bar t foo 69 quux (a))

 -- Function: lax-plist-get plist property
     Like plist-get except that it compares properties using equal instead of eq.

 -- Function: lax-plist-put plist property value
     Like plist-put except that it compares properties using equal instead of eq.

 -- Function: plist-member plist property
     This returns non-nil if PLIST contains the given PROPERTY.  Unlike plist-get, this allows you to distinguish between a missing property and a property with the value nil. The value is actually the tail of PLIST whose car is PROPERTY.