gpt4 book ai didi

scheme - 将值绑定(bind)到环境模型中的帧

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:31 25 4
gpt4 key购买 nike

我对评估环境模型的工作原理有点困惑,希望有人能解释一下。

SICP 说:

The environment model specifies: To apply a procedure to arguments, create a new environment containing a frame that binds the parameters to the values of the arguments. The enclosing environment of this frame is the environment specified by the procedure. Now, within this new environment, evaluate the procedure body.

第一个例子:

如果我:

(define y 5)

在全局环境下,然后调用

(f y)

在哪里

(define (f x) (set! x 1))

我们构建了一个新环境 (e1)。在 e1 中,x 将绑定(bind)到 y (5) 的值。在正文中,x 的值现在是 1。我发现 y 仍然是 5。我认为这是因为 x 和 y 位于不同的帧中。也就是我完全替换了x的值。我修改了绑定(bind) x 的框架,而不仅仅是它的值。对吗?

第二个例子:

如果我们在全局环境中:

(define (cons x y)
(define (set-x! v) (set! x v))
(define (set-y! v) (set! y v))
(define (dispatch m)
(cond ((eq? m 'car) x)
((eq? m 'cdr) y)
((eq? m 'set-car!) set-x!)
((eq? m 'set-cdr!) set-y!)
(else (error "Undefined
operation: CONS" m))))
dispatch)

(define (set-car! z new-value)
((z 'set-car!) new-value)
z)

现在我说:

(定义 z2(缺点 1 2))

假设 z2 在名为 e2 的环境中有一个调度过程的值,我调用:

(set-car! z2 3)

定车!创建一个新环境 e3。在 e3 中,参数 z 被绑定(bind)到 z2 的值(e2 中的调度过程),就像我的第一个例子一样。主体执行后,z2 现在是 '(3 2)。我想定车!它的工作方式是因为我正在更改 z 持有的对象的状态(它在全局中也被 z2 引用),但没有替换它。也就是说,我没有修改z绑定(bind)的frame。

在第二个示例中,global 中的 z2 和 e3 中的 z 似乎是共享的。我不确定我的第一个例子。根据在环境模型中应用程序的规则,虽然 x 和 y 是共享的,但由于 5 没有本地状态,因此完全无法检测到。

我说的都对吗?我误解了这句话吗?

最佳答案

回答你的第一个问题:假设你打算在你的第一个问题中写(f y)而不是(f 5),y没有被修改的原因 Racket (像大多数语言一样)是一种“按值(value)调用”的语言。也就是说,值被传递给过程调用。在这种情况下,在调用 f 之前,参数 y 的计算结果为 5。改变 x 绑定(bind)不会影响 y 绑定(bind)。

回答您的第二个问题:在您的第二个示例中,存在共享环境。也就是说,z 是一个对环境封闭的函数(您称它为 e2)。每次调用 z 都会创建一个链接到现有 e2 环境的新环境。在此环境中对 xy 执行突变会影响以后对 e2 环境的所有引用。

总结:传递变量的值不同于传递包含该变量的闭包。如果我说

(f y)

...调用完成后,“y”仍将引用相同的值[*]。如果我写

f (lambda (...) ... y ...)

(也就是说,传递一个引用了 y 的闭包,然后在调用 f 之后 y 可能会绑定(bind)到一个不同的值。

如果您对此感到困惑,那么您并不孤单。关键是:不要停止使用闭包。相反,停止使用突变。

[*] 如果 y 是一个可变值,它可能会发生变化,但它仍然是“相同”的值。请参阅上面关于混淆的注释。

关于scheme - 将值绑定(bind)到环境模型中的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53685764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com