SICP問題1.6
(define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))) ; => new-if (new-if (= 2 3) 0 5) ; => 5 (new-if (= 1 1) 0 5) ; => 0 (define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) (sqrt 2)
Gauche で実行すると
GC Warning: Out of Memory! Returning NIL! out of memory (32). aborting... Process scheme exited abnormally with code 1
になる
これはnew-ifの評価が始まる前に、呼び出し元(sqrt-iter)で引数の評価が行われるため、再度sqrt-iterを呼び出すという無限ループが発生することが原因である。
(作用的順序を行う評価では引数を解釈してから作用させるため)
ifは特殊形式であり述語がtrueにならない限りelse節は評価されないが、new-ifは通常の手続きのため、then節, else節が評価され後で分岐を評価しようとするため上記のような動作となってしまう。