遅延評価と再帰

 上記の非末尾再帰のfactは、もしかしたらfact 5 = 5 * fact 4 = 5 * 4 * fact 3 = 20 * fact 3 ...という風に実行されてるんじゃなかろうか。そうだとしたら、スタックが溢れない説明がつく。つまり、スタックの内容を簡約できそうなら、簡約してしまう、と。
 実際、簡約した結果がメモリの使用量を減らすような関数が実行できそうなら実行する、という評価戦略は実装できそうな気がする。
 いや、単にスタックが大きく取られてるので溢れてないだけ、という可能性もあるのだけれど…。(追記:単にマシンスタックが溢れた際の対策が取られてるだけなんじゃないか、という気がしてきた。)