Listen sind ein sehr häufiger Datentyp in Common Lisp.
Sie bestehen aus einer Folge von cons-Zellen.
Jedes car ist ein Element der Liste und jedes cdr ist entweder die nächste cons-Zelle oder ein abschließendes Atom.
Eine Liste, die mit der leeren Liste endet, nennt man eine „Proper List“.
Eine Liste, die mit einem Atom endet, das nicht die leere Liste ist, nennt man eine „Dotted List“ (nach der Art, wie sie ausgegeben wird: (cons 'a 'b) ;=> (a . b)).
Eine Liste kann außerdem zirkulär sein, wenn die cdr irgendeiner cons-Zelle in der Liste auf eine spätere cons-Zelle verweist.
Zum Beispiel: (let ((x (list 1))) (setf (cdr x) x) (write x :stream t :circle t) :done).
Sei vorsichtig bei der Arbeit mit zirkulären Listen: Lässt du sie ausgeben, ohne *print-circle* an t zu binden, entsteht eine Endlosschleife und die REPL hängt sich auf (in diesem Beispiel wird *print-circle dadurch an t gebunden, dass write das Argument :circle t erhält).
Du kannst append mit beliebig vielen Listen aufrufen, auch mit 1 oder 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) ; => ()
Als Alternative zu append gibt es nconc, das dasselbe Ergebnis liefert, aber die Listen als Seiteneffekt verändert. Sei vorsichtig bei der Verwendung von nconc, denn es kann überraschende Effekte haben.