Cons
construit une "cellule de contre". Cela n'a rien à voir avec les listes au début. Une cellule cons est une paire de deux valeurs. Une cellule cons est représentée sous forme écrite par une "paire pointée", par ex. (A . B)
, qui contient les deux valeurs 'A
et 'B
.
Les deux emplacements d'une cellule de contre-exemple sont appelés "car" et "cdr". Vous pouvez visualiser une telle cellule contre un bloc coupé en deux:
car cdr
+-----+-----+
| A | B |
+-----+-----+
En Lisp, une valeur peut aussi être une référence à quelque chose d'autre, par exemple, une autre cellule de contre:
+-----+-----+ +-----+-----+
| A | --------> | B | C |
+-----+-----+ +-----+-----+
Ce serait représenté sous forme de "paire pointée" sous la forme (A . (B . C))
. Vous pouvez continuer comme ça:
+-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | D |
+-----+-----+ +-----+-----+ +-----+-----+
C'est (A . (B . (C . D)))
. Comme vous pouvez le voir, dans une telle structure, les valeurs sont toujours dans la car
d'une cellule par défaut, et les cdr
pointent vers le reste de la structure. Une exception est la dernière valeur, qui est dans la dernière cdr
. Nous n'avons pas besoin de cette exception, cependant: il y a une valeur spéciale NIL
dans Lisp, qui indique "rien".En mettant NIL
dans le dernier cdr
, vous avez une valeur sentinelle à portée de main, et tous vos valeurs sont dans les car
s:
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | --------> | D | NIL |
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
Voici comment une liste est construite en Lisp. Depuis (A . (B . (C . (D . NIL))))
est un peu lourd, il peut également être représenté simplement comme (A B C D)
. NIL
est également appelée la liste vide ()
; ce sont des notations échangeables pour la même chose.
Maintenant vous pouvez voir pourquoi (cons x list)
retourne une autre liste. Cons
construit simplement une autre cellule de contre avec x
dans le car
et une référence à list
dans le cdr
:
+-----+-----+
| X | --------> list
+-----+-----+
et si list
est (A B)
, cela fonctionne comme:
+-----+-----+ +-----+-----+ +-----+-----+
| X | --------> | A | --------> | B | NIL |
+-----+-----+ +-----+-----+ +-----+-----+
Ainsi, (cons x '(a b))
évalue à (x a b)
.
Les listes sont juste une utilisation très commune de contre les cellules. Vous pouvez également construire des arborescences arbitraires à partir de cellules ou de listes circulaires, ou de n'importe quel graphe orienté.
CONS revient toujours une cellule. –