[電車の中でコツコツ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"っていう文字列を表示。