2011-04-30 67 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

希望這可以幫助,

傑森