Я запутался в деструктивных операциях в Scheme. Допустим, у меня есть список и некоторые деструктивные процедуры, определенные в глобальной среде:
(define a '(a b c))
(define (mutate-obj x)
(set! x '(mutated)))
(define (mutate-car! x)
(set-car! x 'mutated))
(define (mutate-cdr! x)
(set-cdr! x 'mutated))
Тогда у нас есть следующая оценка выражения:
(mutate-obj! a) a => (a b c)
(mutate-car! a) a => (mutated b c)
(mutate-cdr! a) a => (mutated . mutated)
Почему set!
не влияет на a
за пределами своей процедуры, когда действуют и set-car!
, и set-cdr!
? Почему выражение в первой строке не равно (mutated)
? Как все это работает на самом деле?