Cons
costruisce una "cella cons". All'inizio questo non ha niente a che fare con le liste. Una cella di controllo è una coppia di due valori. Una cella contro è rappresentata in forma scritta da una "coppia puntata", ad es. (A . B)
, che contiene i due valori 'A
e 'B
.
I due punti in una cella di controllo sono chiamati "auto" e "cdr". È possibile visualizzare una cella quali svantaggi come un blocco Diviso in due parti:
car cdr
+-----+-----+
| A | B |
+-----+-----+
In Lisp, un valore può anche essere un riferimento a qualcos'altro, ad esempio, un'altra cella cons:
+-----+-----+ +-----+-----+
| A | --------> | B | C |
+-----+-----+ +-----+-----+
Questo sarebbe rappresentato in forma "doppietta" come (A . (B . C))
. È possibile continuare in questo modo:
+-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | D |
+-----+-----+ +-----+-----+ +-----+-----+
Questo è (A . (B . (C . D)))
. Come si può vedere, in una struttura di questo tipo, i valori sono sempre nello car
di una cella contro e il cdr
punta al resto della struttura. Un'eccezione è l'ultimo valore, che si trova nell'ultimo cdr
. Tuttavia, non abbiamo bisogno di questa eccezione: esiste un valore speciale NIL
in Lisp, che indica "nulla".Mettendo NIL
nell'ultimo cdr
, si dispone di un valore sentinella a portata di mano, e tutti i i valori sono nei car
s:
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | --------> | D | NIL |
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
Questo è come una lista è costruito in Lisp. Poiché (A . (B . (C . (D . NIL))))
è un po 'ingombrante, può anche essere rappresentato semplicemente come (A B C D)
. NIL
è anche chiamato la lista vuota ()
; queste sono notazioni scambiabili per la stessa cosa.
Ora è possibile vedere perché (cons x list)
restituisce un altro elenco. Cons
costruisce semplicemente un'altra cella cons con x
nel car
e un riferimento alla list
nel cdr
:
+-----+-----+
| X | --------> list
+-----+-----+
e se list
è (A B)
, funziona come:
+-----+-----+ +-----+-----+ +-----+-----+
| X | --------> | A | --------> | B | NIL |
+-----+-----+ +-----+-----+ +-----+-----+
Quindi, (cons x '(a b))
viene valutato come (x a b)
.
Le liste sono solo un uso molto comune delle celle contro. Puoi anche costruire alberi arbitrari da cellule cons, o liste circolari, o qualsiasi grafico diretto, in realtà.
CONS restituisce sempre una cella. –