Citazione
Quote restituisce i dati che dovresti non modificare e quali possono condividere la struttura tra loro.
Per esempio. se hai un file che contiene
(define l1 '(1 2 3))
(define l2 '(4 2 3))
quindi il compilatore può allocare l1
e l2
in modo che condividano la coda comune (cdr l1)
e (cdr l2
) e / o nella memoria di sola lettura.
La modifica di tali elenchi è comportamento indefinito .
Fai non fallo.
list
list
e cons
creano oggetti nuovi (diversi da tutto ciò che esiste già), allocano e popolano la memoria. Ne possiedi - puoi modificarli quanto vuoi.
Il tuo caso
Entrambi le tue set-car!
chiamate sono errate - stai modificando i dati di sola lettura e quindi innescando comportamento indefinito (es. fortunato il tuo computer non è esploso in faccia: -).
Specificamente, nel primo caso, ls1
, ottieni ciò che otterresti se facessi la cosa giusta, cioè,
(define ls1
(cons (cons 1 2)
(cons 1 2)))
mentre nel secondo caso l'implementazione assegnava solo una cella cons (1 . 2)
e la riutilizzava nella creazione di ls2
, cioè, vedi cosa vedresti se valutassi quanto segue ( legale) codice:
(define ls2
(let ((l (cons 1 2)))
(cons l l)))
Se ci fossero stampa -circle nello schema , potresti vedere il riutilizzo dei dati:
[1]> (let ((l (cons 1 2)))
(cons l l))
((1 . 2) 1 . 2)
[2]> (setq *print-circle* t)
T
[3]> (let ((l (cons 1 2)))
(cons l l))
(#1=(1 . 2) . #1#)
Binding
x
è associato a un valore significa che il nome x
si riferisce all'oggetto, allo stesso modo in tutte le lingue.
La differenza in Lisp / Scheme è l'oggetto.
Questa è la prima cella di contro dell'elenco - come probabilmente hai vista molte volte, una (collegata) lista è una catena di cella cons, dove car
contiene il valore e cdr
contiene la cella cons successiva nell'elenco.