問題1.5, p.12

まず、作用的順序と正規順序の定義を確認する。

  • 正規順序:完全に展開し、簡約する
  • 作用的順序:引数を評価し、作用させる

この問題ではpが循環定義されているのがポイント。pを評価すると、無限ループに陥る。

正規順序での評価は以下の通り。

(test 0 (p))
=> (if (= x 0) 0 y))
=> (if (= 0 0) 0 y))
=> 0

作用的順序での評価は以下の通り。

(test 0 (p))
=> (test 0 (p))
=> (test 0 (p))
=> (test 0 (p))
=> ..以下同様に無限にループ

サンプルコード

;code/problem-1-5.scm

(define (p) (p))

(define (test x y)
    (if (= x 0) 0 y))

;(test 0 (p))

実行結果

無限ループする。