首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案环境中的破坏性操作

方案环境中的破坏性操作
EN

Stack Overflow用户
提问于 2013-04-05 22:10:35
回答 1查看 681关注 0票数 1

我对Scheme中的破坏性操作感到困惑。假设我有一个列表和一些在全局环境中定义的破坏性过程:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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)?这一切到底是如何工作的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-05 22:16:37

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

代码语言:javascript
复制
(define (mutate-obj)
  (set! a '(mutated)))

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15836127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档