[電車の中でコツコツScheme処理系を書く日記] 3駅目
とりあえず、汚いながら
void yz_vm_test(void) { YzVM vm; YzExecImage img; yz_vm_init(&vm); yz_img_init(&img); YZ_WRITE_PUSHI(&img, 100); YZ_WRITE_PUSHI(&img, 200); YZ_WRITE_NOP (&img); YZ_WRITE_MULI (&img); YZ_WRITE_PUSHI(&img, 19999); YZ_WRITE_SUBI (&img); YZ_WRITE_PRINT(&img); YZ_WRITE_EOP (&img); yz_vm_execute(&vm, &img); yz_vm_free(&vm); yz_img_free(&img); }
みたいなプログラムを書いてVMを起動すると
PUSHI pc = 0, sp = 0 PUSHI pc = 5, sp = 1 NOP pc = 10, sp = 2 MULI pc = 11, sp = 2 PUSHI pc = 12, sp = 1 SUBI pc = 17, sp = 2 PRINT pc = 18, sp = 1 1 EOP pc = 19, sp = 1
っていう結果がでるようになりました。とりあえず無事にVMがよちよち歩きを始めたようです。
ちなみに、yz_
というプリフィックスは、処理系の名前をYourZone
にしたからです。言語処理系らしからぬ名前ですが、けっこう気に入っています。
次は「シンボルからオブジェクトを取得する」というのと、「関数(closure)を呼び出す」という2つの大事な操作を実装します。クロージャの内部データ構造にかなり悩んでます。というか、R5.97RSをちゃんと読まないと決心できなさそう。
あと、SourceForceでアカウントとりました。そのうちソースを公開します。