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))) を評価しようとし、無限ループになってしまう。
正規順序の言語の場合は、必要となるまで引数の評価は行われないため、正常に実行される。