SICP問題4.25

手続きunlessの定義

(define (unless condition usual-value exceptional-value)
  (if condition exceptional-value usual-value))

上記のunlessを使用して以下のようなfactorialを定義する

(define (factorial n)
  (unless (= n 1)
    (* n (factorial (- n 1)))
    1))

作用順序のScheme

(factorial 5)

を実行すると何が起きるか?

実際に実行してみると無限ループになる。理由は以下のとおりである。
unless は特殊形式でないためunlessに引数 condition, usual-value, exception-value を適用する際に、全ての引数が評価される。
このため (= n 1) の時点でも unless は (* n (factorial (- n 1))) を評価しようとし、無限ループになってしまう。

正規順序の言語の場合は、必要となるまで引数の評価は行われないため、正常に実行される。