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
- 無くても挙動変わらんような……