Lists are a very common data type in Common Lisp.
They are made up of a sequence of cons cells.
Each car
is an element of the list and every cdr
is a either the next cons cell or a terminating atom.
A list which terminates with the empty list is called a "proper list".
A list which terminates with an atom that is not the empty list is called a "dotted list" (based upon how it is printed: (cons 'a 'b) ;=> (a . b)
).
A list can also be circular if some cons cell in the list cdr
of a later cons cell.
For example: (let ((x (list 1))) (setf (cdr x) x) (write x :stream t :circle t) :done)
.
Take care when working with circular lists as allowing them to be printed out without binding *print-circle*
to t
will cause an infinite loop and will lock up the REPL (in this example by specifying :circle t
to write
, *print-circle
will be bound to t
).
You can call append
with any number of lists, including 1 or 0:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '())) ; => (A B C)
(append '(a b c)) ; => (A B C)
(append) ; => ()
As an alternative to append
there is nconc
which has the same result but has the side-effect of modifying the lists. You should be careful when using nconc
as it may have surprising effects.