Οι λίστες είναι ένας από τους πιο συνηθισμένους τύπους δεδομένων στη 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 με οποιονδήποτε αριθμό λιστών, ακόμη και με 1 ή 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) ; => ()
Ως εναλλακτική της append υπάρχει η nconc, η οποία δίνει το ίδιο αποτέλεσμα αλλά έχει την παρενέργεια να τροποποιεί τις λίστες. Πρέπει να προσέχεις όταν χρησιμοποιείς τη nconc, καθώς μπορεί να έχει απρόσμενες επιπτώσεις.