読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

[電車の中でコツコツScheme処理系を書く日記] 6駅目

R5.97RSを元にScheme処理系作成中。VMがよちよち歩きを始めました。

ネイティブ関数の呼び出し完了。

YzValue* yz_func_pp(int argc, YzValue* argv[]) {
  assert(argc == 1);

  yz_print_exp(stdout, argv[0]);
  fprintf(stderr, "\n");

  return yz_nil_init();
}


void yz_vm_test(void) {
  YzVM *vm = yz_vm_create();
  YzExecImage *img = yz_img_create();


  YzSym test = yz_sym_intern("test");
  YzSym pp = yz_sym_intern("pp");

  yz_env_register(img->root_env, test, yz_integer_init(100) );
  yz_env_register(vm->core_env, pp, yz_nfunc_create(yz_func_pp));
  assert(img->root_env->symbols);

  YZ_WRITE_LOADSYM(img, pp);
  YZ_WRITE_LOADVAL(img);
  YZ_WRITE_LOADS(img, "test");

  YZ_WRITE_CALL(img,1);
  YZ_WRITE_POP(img);

  YZ_WRITE_EOP  (img);

  yz_img_print_iseg(img);
  yz_vm_execute(vm, img);
}

実行結果:
(pp関数は標準出力、opcodeのダンプは標準エラー出力なんで、表示のタイミングがずれてますが…)

$ ./yourzone                     [~/yourzone/src]
   00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
   -----------------------------------------------
00 05 a0 10 00 00 06 03 00 00 00 00 08 01 00 00 00
10 07 00

        LOADSYM pc = 0, sp = 0
        LOADVAL pc = 5, sp = 1
        LOADS   pc = 6, sp = 1
        CALL    pc = 11, sp = 2

        POP     pc = 16, sp = 1
        EOP     pc = 17, sp = 0
"test"

次は基本的な関数の実装をして、パーザーからコード変換。

【広告】