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 を見間違えてました。
ちょっと前に
色々見たばかりなのにスデに忘却の彼方。該当エントリを見ても微妙だった、という事はログの残し方が微妙なんだなぁ、と反省。どうもイケマセン。