我对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))然后我们有下面的表达式evaulation:
(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)?这一切到底是如何工作的呢?
发布于 2013-04-05 22:16:37
第一个示例并不像您想象的那样工作。尽管x参数和a全局变量都指向相同的列表,但在执行(set! x '(mutated))时,只需将x (过程的本地参数)设置为指向不同的列表,而a保持不变。如果你这样写就会有所不同:
(define (mutate-obj)
(set! a '(mutated)))现在,a在过程中发生了变化。第二个和第三个过程修改a列表的内容,这也是由x指出的,因此一旦该过程返回,更改就会在“外部”反映出来。
https://stackoverflow.com/questions/15836127
复制相似问题