2011-12-11 80 views

回答

9

我知道,我們通常要求的內容被複制,但沒有簡短的回答你的問題。 http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf

+2

The Dybvig et al。紙是一個很好的。幾年前還有一個很好的[關於Lambda終極版的討論](http://lambda-the-ultimate.org/node/2971),講述瞭如何在lambda方面實現letrec。 (說了這麼多,我同意sacundim的評論,「僅僅因爲功能特徵是在幕後執行命令性代碼,並不能使這個功能成爲必需的」)。 –

8

號僅僅因爲一個功能特徵與幕後必要的代碼,不會使功能勢在必行實現。我們的計算機器都是必不可少的;所以在某些時候,所有的功能代碼都必須通過翻譯成命令式的代碼來實現!

最關鍵的事情在這裏明白的是:函數式編程涉及接口,不實施。一段代碼是功能性的,如果是代碼本身是無法觀察任何副作用,即使副作用實際上發生在幕後。也就是說,如果您檢查相同的綁定同一個變量多次的價值,你會得到相同的值,即使這個值,在幕後,是由使用的set!放在那裏。

letrec的情況下,這裏有一個小難題:如果任何在letrec綁定的評估導致另一個被derefenced結果是不確定的。所以,這個代碼的結果是不確定的:

(letrec ((foo bar) 
     (bar 7)) 
    (cons foo bar)) 

foo在letrec主體的價值是不確定的。以下的結果,在另一方面,被定義:

(letrec ((foo (lambda() bar)) 
     (bar 7)) 
    (cons (foo) bar)) 

這是因爲評估lambda捕獲參考吧,但直到閉合在主體執行的實際值未查找。

相關問題