我需要帮助评估该代码时绘制环境模型图的相关部分:Lambda和环境模型
Scheme>(define x 10)
Scheme> ((lambda (x y) (+ (y 3) x)) 6 (lambda (w) (* x 9)))
我需要确保与下一个写每个拉姆达身体到它是环境正在评估。
好吧,我知道,只有一个限定所以大部分工作将通过“匿名”或“无名”功能完成,这些仍然会在环境中的模型图
我需要帮助评估该代码时绘制环境模型图的相关部分:Lambda和环境模型
Scheme>(define x 10)
Scheme> ((lambda (x y) (+ (y 3) x)) 6 (lambda (w) (* x 9)))
我需要确保与下一个写每个拉姆达身体到它是环境正在评估。
好吧,我知道,只有一个限定所以大部分工作将通过“匿名”或“无名”功能完成,这些仍然会在环境中的模型图
如果不同的方式显示出来我记得没错,每当你执行一个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的课程,但它得到了我的教授的支持(显然他的一个学生在当天写了回来),其他人似乎使用它很好。
吉洪给了一个很好的答案,但有一个在SICP的这部分,其中包括关闭的评估方式对心理模型图一些附加信息:http://mitpress.mit。埃杜/ SiC颗粒/全文/书籍/ b OOK-Z-H-21.html#%_ sec_3.2 – spacemanaki 2011-05-01 04:01:02