Lambda和环境模型

Sch*_*020 5 environment scheme

在评估此代码时,我需要帮助绘制环境模型图的相关部分:

Scheme>(define x 10)
Scheme> ((lambda (x y) (+ (y 3) x)) 6 (lambda (w) (* x 9)))
Run Code Online (Sandbox Code Playgroud)

我需要确保并将每个lambda主体写在评估它的环境旁边.

好吧,我知道只有一个定义,因此大部分工作将由"匿名"或"无名"功能完成,这些仍将以各种方式显示在环境模型图中

Jas*_*son 5

除了已经给出的答案之外,麻省理工学院的6.001课程还有两个非常全面的环境模型讲座,它存在的原因,以及一些非常有用和细粒度的分步示例:

第1
讲第2讲

希望这可以帮助,

贾森


Tik*_*vis 4

如果我没记错的话,每当您执行 lambda 时,就会创建一个新环境,其中参数的值将与其名称绑定。该环境继承自 lambda 最初声明的环境。

在所有情况下,第一个环境是全局环境——这是它所(define x 10)在的地方。然后,正如我之前所说,每当执行 lambda 时都添加一个新环境(如第二行所示)。该环境继承自执行 lambda 的环境。

您所做的第一件事(从第二行开始)是调用第一个 lambda。为此,您必须评估论点。由于您在实际输入第一个 lambda 之前评估参数,因此第二个 lambda 是在全局环境中声明的。

接下来,为第一个 lambda 调用创建一个环境(继承自全局环境)。这里x绑定到 6 并y绑定到第二个 lambda。然后,为了执行+,调用第二个 lambda。由于它是在全局环境中声明的,因此它的新环境继承自此环境,而不是第一个 lambda 的环境。这意味着,对于第二个,x必然为 10 而不是 6。

我希望这可以理解地解释一切。

澄清一下:将存在三个环境——全局环境和每个函数调用一个环境。两个函数调用的环境都将从全局环境继承。第一个 lambda 的代码将在其自己的环境中运行,而第二个 lambda 的代码将运行第二个 lambda 的代码。

另外,请查看envdraw,可以在这里找到: http: //inst.eecs.berkeley.edu/~cs3s/stk/site-scheme/envdraw/ 如果您阅读了 ANNOUNCE 文件,它会告诉您如何获取它。您需要使用 STk,一种特定的方案解释器。

envdraw自动绘制Scheme的环境图。

免责声明:在上使用Scheme的课程时,我从来没有费心envdraw,但它得到了我的教授的认可(显然是他的一位学生当天写回来的),而且其他人似乎使用它做得很好。