2011-04-30 60 views
3

我需要帮助评估该代码时绘制环境模型图的相关部分:Lambda和环境模型

Scheme>(define x 10) 
Scheme> ((lambda (x y) (+ (y 3) x)) 6 (lambda (w) (* x 9))) 

我需要确保与下一个写每个拉姆达身体到它是环境正在评估。

好吧,我知道,只有一个限定所以大部分工作将通过“匿名”或“无名”功能完成,这些仍然会在环境中的模型图

+0

吉洪给了一个很好的答案,但有一个在SICP的这部分,其中包括关闭的评估方式对心理模型图一些附加信息:http://mitpress.mit。埃杜/ SiC颗粒/全文/书籍/ b OOK-Z-H-21.html#%_ sec_3.2 – spacemanaki 2011-05-01 04:01:02

回答

3

如果不同的方式显示出来我记得没错,每当你执行一个lambda时,就会创建一个新的环境,其中参数的值被绑定到它们的名字上。该环境从最初声明λ的任何环境继承。

所有情况下的第一个环境是全球环境 - 这是(define x 10)所在的地方。然后,正如我之前所说的,每当您执行一个lambda时(如第二行),添加一个新的环境。这个环境继承了lambda被执行的任何环境。

你做的第一件事(从第二行开始)叫做第一个lambda。要做到这一点,你必须评估参数。由于在实际输入第一个lambda之前评估参数,因此第二个lambda在全局环境中声明。

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

我希望这可以解释所有事情。

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

此外,检查出envdraw,它可以在这里找到:http://inst.eecs.berkeley.edu/~cs3s/stk/site-scheme/envdraw/ 如果您阅读ANNOUNCE文件,它会告诉你如何得到它。你需要使用STk,一个特定的Scheme解释器。

envdraw自动绘制Scheme的环境图。

免责声明:我从来没有用envdraw来打扰使用Scheme的课程,但它得到了我的教授的支持(显然他的一个学生在当天写了回来),其他人似乎使用它很好。

3

除了已经给出的答案,6。001当然在麻省理工学院对环境模型两个非常全面的演讲,原因是它的存在,以及一些非常有益的,细粒度一步一步的例子:

Lecture 1
Lecture 2

希望这可以帮助,

杰森