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"っていう文字列を表示。