地雷
これはキツい。
CASE(SCM_VM_APPLY) { int nargs = SCM_VM_INSN_ARG(code); ScmObj cp; while (--nargs > 1) { POP_ARG(cp); VAL0 = Scm_Cons(cp, VAL0); } cp = VAL0; /* now cp has arg list */ POP_ARG(VAL0); /* get proc */ TAIL_CALL_INSTRUCTION(); VAL0 = Scm_VMApply(VAL0, cp); NEXT1; }
最初のブロックで cp に引数リスト、val0 に手続きがナニ。以降が重い。
NEXT1
よく考えたら NEXT1 って命令をよく理解できてないな。
#define NEXT1 \ do { \ vm->numVals = 1; \ NEXT; \ } while (0)
numVals って属性は一体、と言いつつ Reading Gauche/vm.c/NEXT1 を確認。
numVals に 1 をセットして NEXT する、という意味で NEXT1 なのか。number of value ってどーゆー意味でしょ。
vm.h
ScmVMRec 構造体のメンバの一つが numVals なんですが、その直上に以下の定義が
ScmObj vals[SCM_VM_MAX_VALUES]; /* Value register for multiple values */
確か gauche は複数の値を戻せるんだったな。もしかすると instruction が、なのかも。おそらく numVals は vals の要素の数のはず。でもこれと tail position 云々のカラミがよく分かりません。
TAIL_CALL_INSTRUCTION
継続フレームとかどっかで聞いた記憶あり。次、か。
ちょっと PC とか NEXT とかの instruction についてきっちり確認した方が良さげ。ちょっと時間かかりそうですが、がっつり確認できればヤりたい (弱