Listes généralisées

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.

Irene DURAND
2011-10-14