[電車の中でコツコツ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"
次は基本的な関数の実装をして、パーザーからコード変換。