sicp習題試解 (1.6)
編輯:AJAX詳解  
; ======================================================================
;
; Structure and Interpretation of Computer Programs
; (trial answer to excercises)
;
; 計算機程序的構造和解釋(習題試解)
;
; created: code17 02/24/05
; modifIEd:
; (保持內容完整不變前提下,可以任意轉載)
; ======================================================================
;; SICP No.1.6
;; 本題為理解題
;; 如果將special form "if" 看作普通procedure,把字句(clause)看作參數(Operants),
;; 那麼它和用戶可定義的 "new-if" 的區別在於,if的參數:<predicate> <then-clause>
;; 和 <else-clause> 不需要在代入前evaluate,這相當於采用了normal-order evaluation,
;; 而不是scheme普通procedure采用的applicative-order evaluation。then子句和else
;; 字句中的一個只有在被需要的時候才會evaluate,而另一個根本不會被evaluate。但用戶定義
;; 的procedure "new-if"的3個參數表達式,則都必須在代入前evaluate。
;; 因此,我們可以很容易推斷出new-if的問題
;; 1. 小的問題是效率上不如if,它的then和else字句都要evaluate無論最後是否用得上。
;; 2. 大的問題在於,如果遞歸函數出現於其子句裡,整個evaluation無法終止。
;; 這是因為非無窮遞歸的終止依靠條件判斷,而在new-if中,無論條件子句結果如何,
;; 都必須先進行底層遞歸獲取結果。這樣,在任何第n次procedure的調用中,永遠需要
;; 第n+1次procedure的結果先返回才能決定本層是否終止的問題,這樣就是一個無限遞歸。
;; 所以,可以知道,如果使用new-if替代if,結果是無限遞歸,程序無法終止,交互式解釋器
;; 失去反應。
;; 我們可以猜測,在遞歸函數存在的情況下,語言中一定需要有normal-order evaluation
;; 的成分存在。 否則,考慮遞歸函數f的最一般形式
;; (define (f x)
;; (g x
;; (f (h x))))
;; 可以看到(f x)的evaluation需要等待函數g裡的某個參數(f x)先返回值,無限遞歸。