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

本当は怖い情報科学

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

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

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

シンボルテーブル(的なサムシング)ができました。
次はネイティブ関数の呼び出し。現在はPRINTっていうバイトコード命令を使用しているんですが、早くdisplay関数を呼びたい。

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

  yz_env_register(img->root_env, 999, yz_integer_init(100) );

  YZ_WRITE_LOADSYM(img,999);
  YZ_WRITE_LOADVAL(img);
  YZ_WRITE_PRINT(img);
  YZ_WRITE_POP(img);

  YZ_WRITE_LOADS(img, "test");
  YZ_WRITE_PRINT(img);

  YZ_WRITE_EOP  (img);

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

実行結果

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

        LOADSYM pc = 0, sp = 0
        LOADVAL pc = 5, sp = 1
        PRINT   pc = 6, sp = 1
100
        POP     pc = 7, sp = 1
        LOADS   pc = 8, sp = 0
        PRINT   pc = 13, sp = 1
"test"
        EOP     pc = 14, sp = 1

一番上に出てるのは命令セグメントのダンプ。100っていう数値をシンボル999で環境に登録して、それを読み込んでスタックのトップに積んで、表示。同様に"test"っていう文字列を表示。

【広告】