jestem trochę zdezorientowany przez Wynikiem tego przykładu:zestaw samochodowy! i niech w języku schematu
(define mk-q
(lambda()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Zastanawiam się dlaczego oba x
atomy zostały zastąpione procedurą set-car!
(moje pierwsze przypuszczenie co wynik byłby było ((x) y)
)?
Na przykład:
(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!
Dlaczego oba x
s w pierwszym przykładzie wymienić?
Ponieważ minusy komórka jest zasadniczo dwa wskaźniki do wartości. Podczas pisania '(cons l l)' tworzysz dwa wskaźniki do tego samego obiektu. Po zmianie obiektu oba wpisy nadal wskazują ten sam obiekt. –
Początkowo błędnie odczytałem to jako set-carl, co było zabawne w wodnej sile głodnej nastolatki. – Bill