MiniScheme 読んだり書きかえたり

miniscm.cを書き換えたりしてた。
miniscm.cをGNU GLOBALでHTML化したものオリジナルのminiscm.c
オリジナルのMinischemeでは各種Scheme関数をswitch-caseで呼んでいる。それぞれのScheme関数はopexe_0関数からopexe_6関数のどれかに属する。

オリジナルminiscm.cのScheme関数呼び出しの流れ

  • 各種Scheme関数のユニークなshort値operatorを用いて、dispatch_table[operator]でまずopexe_?関数のアドレスを得る。
  • opexe_?(operator)呼び出し
  • opexe_?内でswitch(operator){case ???: ... }でScheme関数に相当するコードを実行

opexe_0からopexe_6までに分けてるのは、たぶんswitch-caseのcaseが大量になると効率が下がるからかなと思える。でもそれなら、Scheme関数に対応するCの関数書いて、ユニーク値と関数アドレスを対応付けたテーブル作ればいいんじゃねの? と思ったので安易にそうしたりした。miniscm.cのop_hogehogeな関数がそれ。挙動はたぶん変わってない。

オリジナルのコードがそうなってないのはきっと昔は実行効率のためにgotoで飛びまくるコードだったからだろな、と。元々のコードは1989年のものだし。

よくわかってないとこ

gcまわり
読む気無し。
入力解析あたり
tokenとかから始まる、parseの流れがよくわかってない。これは今から読む。
inchar内のstrcpy
無くても挙動変わらんような……

test