おんがえしの blog

作ったプログラムと調べた技術情報

問題1.5

(define (p) (p))

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

作用的順序の場合

無限ループする

(test 0 (p))
=> (test 0 (p))
=> (test 0 (p (p (p) (p))))...

正規順序の場合

まず関数testを展開する

(test x y)
=> (if (= x 0) 0 y)
;xを代入する(yはまだ)
=> (if (= 0 0) 0 y)
=> 0

結論

  1. 作用的順序の場合は無限ループ
  2. 正規順序の場合は0を返す