Normalement, une liste est terminée par le symbole nil. Rien ne nous empêche pourtant de passer n'importe quel objet Common Lisp à la fonction cons. Il est donc possible de créer une suite de paires dont le dernier élément n'est pas nil. Nous appelons ce type de pseudo-listes liste généralisée (en Anglais : dotted list).
Dans la représentation externe d'une liste généralisée, l'objet qui remplace nil est précédé d'un point :
* (cons 3 (cons 2 (cons 1 0)))
(3 2 1 . 0)
*
Les fonctions car et cdr ont leur comportement habituel :
* (cons 1 0)
(1 . 0)
* (cdr (cons 1 0))
0
*
La représentation externe des listes généralisées est gérée correctement par read :
* '(1 2 3 . 4)
(1 2 3 . 4)
*
La fonction print préfère la notation sans point autant que possible :
* '(1 . (2 . (3 . nil)))
(1 2 3)
*
Exercice : Expliquer avec une analyse exacte des résultats de read et eval le résultat obtenu par les trois expressions suivantes :
* (car (cons 1 2))
1
* (car '(cons 1 2))
CONS
* (car ''(cons 1 2))
QUOTE
*
Exercice : Montrer avec des diagrammes de boîtes que les listes générées par read pour les deux représentations externes (1 . ((2 . (3 . nil)) . 4)) et (1 (2 3) . 4) sont identiques.