estoy poco confundido por el resultado de este ejemplo:set-car! y dejar en un lenguaje esquema
(define mk-q
(lambda()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Me pregunto por qué tanto x
átomos han sido reemplazados por set-car!
procedimiento (mi primera suposición de lo que sería el resultado fue ((x) y)
)?
Por ejemplo:
(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!
Porque son las dos x
s en el primer ejemplo reemplazado?
Debido a que una célula contras es esencialmente dos punteros a valores. Cuando escribe '(cons l l)' crea dos punteros al mismo objeto. Cuando cambia el objeto, ambas entradas siguen apuntando al mismo objeto. –
Inicialmente malinterpreté esto como set-carl, lo cual fue entretenido en una especie de fuerza de hambre adolescente. – Bill