GC見直し

どーしてやたらとstackが深くなるんだろうとずっと疑問に思っていたのだが、Lazy Evaluationを使えば良いのか。ScmOp_if内ではevalを呼ばずに式を返して置いて、ScmOp_ifを呼んだeval内でその式を評価。また評価はevalを再帰的に呼び出さず、gotoを使ってeval冒頭に戻る。

と、思い付いたらsiodがやってた。あぁ、あの意味分からんかったコードはこういう事だったんですか...。明日フランス語のテストが終わったらこの辺り改善します。

...

ってか、これが末尾再帰最適化か。多少小賢しい方法だけど。思い付いてから気づいた。アホだ...もっと大域的なjumpをイメージしていた。funcall毎にsetjmpして、末尾再帰の時はlongjmpしてくる感じ。これだとパフォーマンス落ちそうだなぁと思って悩んでいたんだけど、いい方法が見付かって良かった。

siodの場合は、cons(sym_progn, exp); 等としてcaseの文等をbegin相当に再評価しているが、consを呼ぶのは勿体ない。というのも、case文がクリティカルなループ内に有った場合にcons cellがどんどん増えてしまいgcが呼ばれる確立が高くなるからだ。なるべく内部ではオブジェクトをNewしない方が良い。というわけで、ScmOp_ifとScmOp_condの場合は何か違う値を返す事によって、eval内で処理を分けるようにしよう。そうしよう。