コードリーディングメモ:MiniScheme


Minischeme
仮想マシンみたいな処理系。コンパイルせずにSchemeのコードを
辿っていく。Lispマシンはこんな感じ?
読んだ限りでは、再帰がない。擬似的なgotoやりまくり。
とんでもなくシンプル。継続作成->実行の繰り返し。

ソースコード
環境やら継続の保持するのに使っているデータ構造は、これだけ。
struct cell {
unsigned short _flag;
union {
struct {
char *_svalue;
short _keynum;
} _string;
struct {
long _ivalue;
} _number;
struct {
struct cell *_car;
struct cell *_cdr;
} _cons;
} _object;
};

グローバル変数args,envir,dump,value,dump,codeはレジスターみたいなもの。
すべてcellのポインター
args:関数に渡す引数を保持する。
envir:環境を保持
value:関数の戻り値を保持
dump:継続を保持
code:コードの保持。プログラムカウンタみたいなもの。

あとoblistとglobal_envがある。
oblist:シンボルテーブル
global_env:よくわからない。グローバルな環境を保持?

マクロs_save,s_return,s_goto
s_save:現在の継続をdumpに保存する。
s_return:dumpから継続を取り出して、その継続から処理を実行させる。
s_goto:ただのgoto
これだとcall/ccを実装するには、dumpの値を継続オブジェクトに保存するだけで
いいので簡単。
この三つの使われ方がわかれば、たぶんあとは簡単。

ガーべジコレクション
まだあまり読めていない。
たぶんマーク・アンド・スイープ

読むついでRubyに移植してみようかと思いましたが、挫折しました。