sicp習題試解 (1.5)
編輯:AJAX詳解  
; ======================================================================
;
; Structure and Interpretation of Computer Programs
; (trial answer to excercises)
;
; 計算機程序的構造和解釋(習題試解)
;
; created: code17 02/24/05
; modifIEd:
; (保持內容完整不變前提下,可以任意轉載)
; ======================================================================
;; SICP No.1.5
;; 本題為理解題
;; (define (p) (p))
;;
;; 相當於定義了一個無限遞歸函數p, p作為operator,以0個Operant為參數。根據定義
;; 可知,(p)會被evalute為(p), 而(p)再evaluate為(p).... 無窮盡。
;; p自身作為一個procedure是沒有問題的,我們允許定義遞歸函數,但當p作用於Operant
;; 時,(p)是有問題的,因為它的evaluation是無限遞歸的。所以,可知,在scheme中,
;; ()的作用決不僅是優先級的控制工具,而是不可忽略的語義控制工具。p 是一個函數,
;; 而(p)是函數p作用於其參數(0個)後的返回值。
;;
;; Test-it:
;; Welcome to MzScheme version 209, Copyright (c) 2004 PLT Scheme, Inc.
;; > (define (p) (p))
;; > p
;; #<procedure:p>
;; > (p)
;; 交互解釋器在此失去反應
;; (define (test x y)
;; (if (= x 0)
;; 0
;; y))
;; (test 0 (p))
;;
;; 因此,測試函數在不同原則的evaluation順序下的結果就很容易推測了。在
;; normal-order evaluation原則下,只有當一個表達式的值被需要的時候才
;; evaluation, (test 0 (p)) 將被evaluate 為 (if (= 0 0) 0 (p)),
;; 因為判斷條件成立,最後表達式evaluate為0, 不需要計算(p)的值,從而
;; 避免了無限遞歸的發生; 而在applicative-order的原則下, 所有的
;; Operants必須在代入前evaluate,因此(p)的計算無法避免,結果是無限遞歸。
;;
;; Test-it:
;; > (test 0 (p))
;; 交互解釋器在此失去反應, 因為scheme使用applicative-order evaluation
;; 如果我們定義
;; (define (p) p)
;; 則是另外一個意思,它定義了一個有0個operant的函數p, 當它作用於其Operant
;; 時,返回置為其自身,這樣我們有(p)被evaluate為p,那麼((p))被evaluate為
;; (p) 然後再evaluate為p,那麼(((...(((p)))...)))
;;
;; Test-it:
;; > (define (p) p)
;; > p
;; #<procedure:p>
;; > (p)
;; #<procedure:p>
;; > ((p))
;; #<procedure:p>
;; > (((((((((((((((((((((((p)))))))))))))))))))))))
;; #<procedure:p>