libgauche 試す
とりあえず以下なカンジで。
- Scm_Init 呼び出して
- Scm_GlobalVariableRef で + とかをナニ
その後どうすんだろ。Scm_ApplyRec? Scm_Apply?
む
Scm_Load 手続きをニラんでたら load するのに Scm_Apply 手続きを使ってる模様。定義が以下ですが
int Scm_Apply(ScmObj proc, ScmObj args, ScmEvalPacket *packet) { return safe_eval_wrap(SAFE_APPLY, proc, args, NULL, SCM_FALSE, packet); }
safe_eval_wrap という手続きを呼び出している。あらら? これって proc をナニした後の val0 の値が戻ってくるんかいな。や、val0 を戻すのは self_eval_wrap 手続きの中で呼び出されている Scm_VMWithErrorHandler 手続きなのか。
現時点のハードル
user_eval_inner 手続きですな。ここから run_loop() 手続き呼び出してるんですが、user_eval_inner 手続きを呼び出す apply_rec 手続きがカギか。
static ScmObj apply_rec(ScmVM *vm, ScmObj proc, int nargs) { ScmObj program; ScmWord code[2]; code[0] = SCM_WORD(SCM_VM_INSN1(SCM_VM_VALUES_APPLY, nargs)); code[1] = SCM_WORD(SCM_VM_INSN(SCM_VM_RET)); vm->val0 = proc; program = vm->base? SCM_OBJ(vm->base) : SCM_OBJ(&internal_apply_compiled_code); return user_eval_inner(program, code); }
vm->base が '\0' な値としたら、user_eval_inner 手続き内での PC は code の先頭を指す形になっている模様。
ちょっと
日中、objc なパスタの面倒を見てるので頭が切り替えれてないな。