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 をきちんと確認しないと微妙。
このヤリ方って
微妙にダウトかなぁ、と思いつつ休み中にぼちぼち掘ってみます。