SICP問題1.5

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

作用的順序の評価系の場合

作用的順序の評価を使用している解釈系の場合、引数の評価を行ってから、その結果でパラメータを置き換えていく。
(test 0 (p))を実行した場合は (p) の評価を行い結果で test のパラメータを置き換えることになる。
ここで p は (define (p) (p))となっており、(p)の結果を得るためには再度(p)を実行する必要が出てくるため、無限ループに陥ることになる。

正規順序の評価系の場合

正規順序の評価系の場合は基本的演算子だけを持つ式が出て来るまで引数を展開した状態でパラメータを置き換え、その後で評価を行う。(値が必要になるまで被演算子を評価しない。)
このような解釈系で (test 0 (p))を実行した場合、まず test が展開され (if (= 0 0) 0 (p))となる。
ここでif式の評価は 0 となり(p)を評価する必要はないため、結果は 0 となり無限ループとはならない。