Le liste sono un tipo di dato molto comune in Common Lisp.
Sono fatte da una sequenza di celle cons.
Ogni car è un elemento della lista e ogni cdr è la cella cons successiva oppure un atomo terminale.
Una lista che termina con la lista vuota si chiama «lista propria».
Una lista che termina con un atomo diverso dalla lista vuota si chiama «lista puntata» (per come viene stampata: (cons 'a 'b) ;=> (a . b)).
Una lista può anche essere circolare se una sua cella cons è il cdr di una cella cons successiva.
Per esempio: (let ((x (list 1))) (setf (cdr x) x) (write x :stream t :circle t) :done).
Fai attenzione quando lavori con le liste circolari, perché se ne permetti la stampa senza aver legato *print-circle* a t, si innesca un ciclo infinito e il REPL si blocca (in questo esempio, specificando :circle t a write, *print-circle viene legato a t).
Puoi chiamare append con un numero qualsiasi di liste, anche 1 o 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) ; => ()
In alternativa a append c'è nconc, che dà lo stesso risultato ma ha l'effetto collaterale di modificare le liste. Fai attenzione quando usi nconc, perché può avere effetti sorprendenti.