末尾再帰でスタックオーバフローになるのはどうにかなった

末尾再帰が必要な関数に突入したら
 1.末尾再帰フラグをON
 2.現在の環境を変数に保持。
 3.評価を停止。スタックを上る
 4.評価の最後にたどり着いたら末尾再帰フラグを確認
 5.末尾再帰フラグがONだったら フラグを倒して
 6.保持した環境を使用して評価されたものを再評価


1〜6を末尾評価フラグがONにならなくなるまで繰り返すことで
スタックオーバフローは起きなくなりました。


何でもかんでも最適化すると結果がおかしくなります。
でも、いつ末尾再帰なのかってことを
判定する必要があるようです。。。><;

これはどうやろうかな