1

我对 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!影响?为什么第一行的表达式不计算为?这一切究竟是如何运作的?aset-car!set-cdr!(mutated)

4

1 回答 1

0

第一个例子没有像你想象的那样工作。尽管x参数和a全局变量都指向同一个列表,但是当您执行时,(set! x '(mutated))您只需将x(过程的本地参数)设置为指向不同的列表,并且a保持不变。如果你写这个会有所不同:

(define (mutate-obj)
  (set! a '(mutated)))

现在a在过程中发生变异。第二个和第三个过程正在修改列表的内容a也由 指向x,因此一旦过程返回,更改就会反映在“外部”。

于 2013-04-05T14:16:36.620 回答