Списки - дуже поширений тип даних у Common Lisp. Вони складаються з послідовності cons-комірок. Кожен car - елемент списку, а кожен cdr - або наступна cons-комірка, або завершальний атом.
Список, який закінчується порожнім списком, називають «правильним списком».
Список, який закінчується атомом, що не є порожнім списком, називають «точковим списком» (за тим, як він друкується: (cons 'a 'b) ;=> (a . b)).
Список також може бути циклічним, якщо якась cons-комірка у списку є cdr пізнішої cons-комірки. Наприклад: (let ((x (list 1))) (setf (cdr x) x) (write x :stream t :circle t) :done). Будьмо обережні, працюючи з циклічними списками: якщо дозволити їх надрукувати, не звʼязавши *print-circle* з t, це спричинить нескінченний цикл і заблокує REPL (у цьому прикладі, якщо вказати :circle t для write, *print-circle буде звʼязано з t).
append можна викликати з будь-якою кількістю списків, зокрема з одним чи з нулем:
(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) ; => ()
Замість append можна використати nconc, який дає той самий результат, але має побічний ефект: він змінює списки. Будьмо обережні з nconc, бо він може мати несподівані наслідки.