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 なパスタの面倒を見てるので頭が切り替えれてないな。