2013-07-04 16 views
1

This章說的actual-value提取一個thunk真實價值的定義是這樣的:thunk對象的評估如何工作?在SICP

(define (actual-value exp env) 
    (force-it (eval exp env))) 

但如果exp本身就是一個thunk?根據delay-it的定義,這意味着它是形式爲(list 'thunk exp env)的列表對象。然而,eval函數決不能用於處理以「thunk」開頭的標記列表。爲什麼由於cond表達式不匹配,eval不會產生錯誤?

編輯: 我認爲評估下面的表達式應導致一個錯誤:

(define (add a) (+ 2 a)) 
(add 0) 

add是這樣的化合物的程序,因此delay-it是其參數被應用之前進行。 +是一個原始的產物,這意味着actual-value將被調用其參數。參數是2和a。 a是一個thunk對象,因此actual-value在將它傳遞給eval時應該會產生錯誤,因爲eval沒有處理標記爲「thunk」的列表的cond情況。

+0

你能提供一個實際代碼的例子嗎?我有一個預感,它不可能在實踐中發生,通過建設 –

+0

@ÓscarLópez:我已經增加了一個例子。 – kahoon

回答

3

這裏的關鍵是,當我們評估(+ 2 a)a不是一個thunk,它只是一個符號,將在環境中查找,其價值是一個thunk。並且在eval返回thunk後,force-it將照顧強制其價值。讓我們一步一步完成整個過程。

是得到你的榜樣延遲的唯一參數是0,在調用add的時間,但即使如此,該值將通過list-of-arg-values得到強制最終 - 想想看,在某些時候所有的程序的應用程序將導致apply-primitive-procedure,這就是我們強迫thunk的地步。

如果我們在調用list-of-arg-values時執行跟蹤,則按順序傳遞給actual-value的值爲2a2只是評估自己,沒有問題。我們來看看a會發生什麼;這個片段在actual-value

(eval exp env) 

...將接收符號aexp(變量),在環境中尋找它後返回相關的thunk(記住:當我們在apply擴展環境,我們創建的變量和的thunk)之間的綁定,而force-it後會收到一個thunk作爲調用eval的結果:

(force-it (eval exp env))) 

...和force-it知道如何評估thunk,在(thunk? obj)的情況下。就是這樣!最後我們獲得0的實際值。

+1

我完全忘了'actual-value'接收'a'作爲符號。謝謝你的真棒解釋! – kahoon