Sono po 'confuso dal risultato di questo esempio:set-car! e lasciate in un linguaggio schema
(define mk-q
(lambda()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Mi chiedo il motivo per cui entrambe le x
gli atomi sono stati sostituiti da set-car!
procedura (la mia prima ipotesi per quello che sarebbe stato il risultato è stato ((x) y)
)?
Ad esempio:
(define mk-q2
(lambda()
(let ([l '(x)])
(cons l (cons l l)))))
(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!
Perché sono entrambi x
s nel primo esempio sostituito?
Perché una cella cons è essenzialmente due puntatori a valori. Quando scrivi '(cons l l)' crei due puntatori allo stesso oggetto. Quando si modifica l'oggetto, entrambe le voci puntano ancora allo stesso oggetto. –
Inizialmente l'ho interpretato erroneamente come set-carl, il che era divertente in un certo senso della forza della fame in acqua adolescenti. – Bill