Scm_VMCallCC

どんどん標題が変わる。昨晩エントリにて vm.c の Scm_VMCallCC 手続きに行きあたったのは src/stdlib.stub に以下な記述があったから。

(define-cproc call-with-current-continuation (proc)
  (call "Scm_VMCallCC"))

現時点で上記の記述の意味は不明。
# なんとなくな類推は可能ですが ...

行きあたったのは良いのですが、エントリ投入後、引数が微妙に気になる。

ScmObj Scm_VMCallCC(ScmObj proc)
{

proc は ScmObj 型なのか。どこで

(call/cc (lambda (c) (set! cont c) 4))

なソレの lambda 式が ScmObj な proc になるの? というのが気になりはじめて (ry

掘る

うーん。どこで引数な proc が ScmObj になるのか不明。

(list 1 2 3 (call/cc (lambda (c) (set! cont c) 4)) 5 6)

を disasm した結果の核心部分が以下。

     3 PRE-CALL(1) 9
     5 CLOSURE #<lambda 0>      ; (lambda (c) (set! cont c) 4)
     7 PUSH-GREF-CALL(1) #<identifier user#call/cc>; (call/cc (lambda (c) (set! cont c) 4))
     9 PUSH

CLOSURE なインストラクションが? と言いつつ該当部分確認。

            CASE(SCM_VM_CLOSURE) {
                ScmObj body;
                FETCH_OPERAND(body);
                INCR_PC;

                /* preserve environment */
                VAL0 = Scm_MakeClosure(body, get_env(vm));
                NEXT1;
            }

FETCH_OPERAND で取り出したナニを Scm_MakeClosure 手続きに渡している。のですが、取り出した時点で ScmObj 型ですな。FETCH_OPERAND なマクロの定義は

#define FETCH_OPERAND(var)      ((var) = SCM_OBJ(*PC))

ってなってて、PC が何を指してるのか、が気になって気になって (を
ただ、disasm した結果の出力では、

internal_closure_0 (name=#f, code=0x80d7b28, size=5, const=1 stack=0):
args: #f
     0 LREF0                    ; c
     1 GSET #<identifier user#cont>; cont
     3 CONSTI(4)
     4 RET

みたいな出力もあったりなんかして、上記が Scm_MakeClosure 手続きでナニされた手続きオブジェクトの中身なのかなぁ。
このあたりって compile.scm をきちんと確認しないと微妙。

このヤリ方って

微妙にダウトかなぁ、と思いつつ休み中にぼちぼち掘ってみます。