コードリーディングメモ:MiniScheme 2
今日はs_goto、s_save、s_returnを詳しく
#define s_goto(a) BEGINoperator = (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)を実行した場合
まずOP_IF0に来るのですが、s_save(OP_IF1, NIL, cdr(code))を実行したとき
case OP_IF0: /* if */
s_save(OP_IF1, NIL, cdr(code));
code = car(code);
s_goto(OP_EVAL);
cには(a b)が入ります。
OP_EVALが終わると継続が取り出され、OP_IF1を実行します
s_returnはs_saveで作られた継続を取り出しているだけです。
#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_saveでの説明のようにdumpは'(a b envir c dump)のようなリストに
なっているので、例えばcaddr(dump)でenvirが取り出されています。