在评估此代码时,我需要帮助绘制环境模型图的相关部分:
Scheme>(define x 10)
Scheme> ((lambda (x y) (+ (y 3) x)) 6 (lambda (w) (* x 9)))
我需要确保并将每个lambda主体写在评估它的环境旁边。
好的,我知道只有一个定义,因此大部分工作将由“匿名”或“无名”功能完成,这些功能仍会以各种方式显示在环境模型图中
答案 0 :(得分:5)
除了已经给出的答案之外,麻省理工学院的6.001课程还有两个非常全面的环境模型讲座,它存在的原因,以及一些非常有用和细粒度的分步示例: / p>
希望这有帮助,
杰森
答案 1 :(得分:4)
如果我没记错的话,无论何时执行lambda,都会创建一个新的环境,其中参数的值绑定到它们的名称。此环境继承自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的环境图。
免责声明:在参加使用Scheme的课程时,我从未对envdraw
感到困扰,但它得到了我的教授的认可(显然他的一个学生在当天写回来),其他人似乎做得很好它