2012-07-04 382 views
7

練習1.5。 Ben Bitdiddle發明了一個測試,以確定他所面對的翻譯人員是否正在使用應用程序訂單 評估或正常順序評估。他定義下面的兩個 程序:SICP練習1.5

(定義(P)(P))

(定義(測試XY)(如果(= X 0) Y))

然後,他計算表達式

(測試0(p))

將奔觀察哪些行爲與使用 應用性,爲了評估一個解釋?在使用正常順序評估的解釋器中,他會觀察到什麼行爲?

我明白這個練習的答案;我的問題在於如何解釋(p)與p。例如,(測試0(p))導致解釋器掛起(這是預期的),但具有上述定義的(測試0 p)立即計算爲0.爲什麼?此外,假設我們將定義改爲(define(p)p)。根據給定的定義,(測試0(p))和(測試0 p)都評估爲0.爲什麼會發生這種情況?爲什麼口譯員不掛?我正在使用Dr.Retet和SICP​​軟件包。

回答

15

p是一個函數。 (p)是對函數的調用。

在您的翻譯評估p

p <Return> 
==> P : #function 

現在評價(p)。確保你知道如何殺死你的翻譯! (有可能是在拍博士「停止」按鈕。)

(p) 

注意,沒有任何反應。或者,至少,沒有任何可見的。解釋器正在旋轉,消除尾部呼叫(所以,使用接近0的內存),呼叫p

由於p(p)評估不同的事情,你應該期望不同的行爲。

至於你的第二個問題:你正在定義p是一個返回自身的函數。再次嘗試使用您的(define (p) p)評估p(p),看看您得到了什麼。我的猜測(我正在使用一臺我無法安裝任何東西而且沒有任何方案的計算機)是他們會評估相同的東西。 (我甚至可以打賭,(eq? p (p))將評估爲#t。)

+0

+1簡潔的答案。也請嘗試http://codepad.org。 –

+0

謝謝。我也在尋找答案。 – user1166240