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

今日はs_goto、s_save、s_returnを詳しく


#define s_goto(a) BEGIN

operator = (short)(a);

return T; END

おおざっぱに言うとaで指定された命令を実行するマクロ。

例えばs_goto(move)でmove命令を実行する見たいな感じです。(実際にはMiniSchemeにmove命令はありません。)


#define s_save(a, b, c) (
dump = cons(envir, cons)((c), dump))(,
dump = cons((b), dump),
dump = cons(mk_number)((long)(a))(, dump))
継続を作成するマクロ。
こんな感じのリストになります。
'(a b envir c dump)
このリストがdumpに代入される。

aは継続が取り出された時に実行する命令。
envirはs_saveした時点での環境。
bはまだよくわかりません。
cは実行中のコード。
例えば(if t a b)を実行した場合


case OP_IF0: /* if */
s_save(OP_IF1, NIL, cdr(code));
code = car(code);
s_goto(OP_EVAL);
まずOP_IF0に来るのですが、s_save(OP_IF1, NIL, cdr(code))を実行したとき
cには(a b)が入ります。
OP_EVALが終わると継続が取り出され、OP_IF1を実行します

#define s_return(a) BEGIN
value = (a);
operator = ivalue(car(dump));
args = cadr(dump);
envir = caddr(dump);
code = cadddr(dump);
dump = cddddr(dump);
return T; END
s_returnはs_saveで作られた継続を取り出しているだけです。
s_saveでの説明のようにdumpは'(a b envir c dump)のようなリストに
なっているので、例えばcaddr(dump)でenvirが取り出されています。