APPLY のコメント

ひげぽんさんからコメント頂く。

            CASE(SCM_VM_TAIL_APPLY) {
                /*FALLTHROUGH*/
            }
            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;
            }

なソレの

  • NEXT1 直前の val0、PC、スタックの状態についての記述
  • これにより TAIL_APPLY との差異が云々

との事。ぶっちゃけ違いは無いと思っていました。
# FALLTHROUGH だし (を

これって、Scm_VMApply が戻すナニが関係してたりするのかな。ざくっと想像できる範囲で想像してみるに

  • val0 には最後に POP_ARG で取り出した手続き
  • PC には ScmWord な 2 個要素がある配列を指してる
    • 一つめは SCM_VM_INSN1(SCM_VM_TAIL_CALL, 0)
    • 二つめは SCM_VM_INSN(SCN_VM_RET)
  • スタックにはてっぺん方面だけで言えば先頭から push された引数が格納
    • スタック先頭には引数の末端が格納、って言えば良いのか ... (とほほ

あら?

びっくり。ループするかと思った。SCM_VM_TAIL_APPLY と SCM_VM_TAIL_CALL を見間違えてました。

ちょっと前に

色々見たばかりなのにスデに忘却の彼方。該当エントリを見ても微妙だった、という事はログの残し方が微妙なんだなぁ、と反省。どうもイケマセン。