地雷

これはキツい。

            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 についてきっちり確認した方が良さげ。ちょっと時間かかりそうですが、がっつり確認できればヤりたい (弱