我对 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)