From d9e47bdd052a1f68ac526cfc0ac48a02727e9065 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 17 Oct 2013 17:54:28 +0900 Subject: [PATCH] add begin syntax --- include/picrin.h | 3 ++- src/state.c | 1 + src/vm.c | 12 +++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/picrin.h b/include/picrin.h index 6ae5eef3..a83b1df9 100644 --- a/include/picrin.h +++ b/include/picrin.h @@ -23,7 +23,8 @@ typedef struct { pic_callinfo *ci; pic_callinfo *cibase, *ciend; - pic_value sDEFINE, sLAMBDA, sIF, sCONS; + pic_value sDEFINE, sLAMBDA, sIF, sBEGIN; + pic_value sCONS; pic_value sADD, sSUB, sMUL, sDIV; struct pic_env *global_env; diff --git a/src/state.c b/src/state.c index 48740e64..58ccbc47 100644 --- a/src/state.c +++ b/src/state.c @@ -48,6 +48,7 @@ pic_open() pic->sDEFINE = pic_intern_cstr(pic, "define"); pic->sLAMBDA = pic_intern_cstr(pic, "lambda"); pic->sIF = pic_intern_cstr(pic, "if"); + pic->sBEGIN = pic_intern_cstr(pic, "begin"); pic->sCONS = pic_intern_cstr(pic, "cons"); pic->sADD = pic_intern_cstr(pic, "+"); pic->sSUB = pic_intern_cstr(pic, "-"); diff --git a/src/vm.c b/src/vm.c index 90be78f0..910c2b73 100644 --- a/src/vm.c +++ b/src/vm.c @@ -227,11 +227,12 @@ static struct pic_irep *pic_gen_lambda(pic_state *, pic_value, struct pic_env *) static void pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *env) { - pic_value sDEFINE, sLAMBDA, sIF, sCONS, sADD, sSUB, sMUL, sDIV; + pic_value sDEFINE, sLAMBDA, sIF, sBEGIN, sCONS, sADD, sSUB, sMUL, sDIV; sDEFINE = pic->sDEFINE; sLAMBDA = pic->sLAMBDA; sIF = pic->sIF; + sBEGIN = pic->sBEGIN; sCONS = pic->sCONS; sADD = pic->sADD; sSUB = pic->sSUB; @@ -309,6 +310,15 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en irep->code[t].u.i = irep->clen - t; break; } + else if (pic_eq_p(pic, proc, sBEGIN)) { + pic_value v, seq; + + seq = pic_cdr(pic, obj); + for (v = seq; ! pic_nil_p(v); v = pic_cdr(pic, v)) { + pic_gen(pic, irep, pic_car(pic, v), env); + } + break; + } else if (pic_eq_p(pic, proc, sCONS)) { pic_gen(pic, irep, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), env); pic_gen(pic, irep, pic_car(pic, pic_cdr(pic, obj)), env);