From 038020ff9fbe344f1c04852ebabee340a6dce716 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 9 Dec 2013 23:00:13 -0800 Subject: [PATCH] sequentially evaluate programs declared in library at the macroexpansion phase --- src/macro.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/macro.c b/src/macro.c index 01b7dd38..317c86f5 100644 --- a/src/macro.c +++ b/src/macro.c @@ -263,22 +263,35 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv) if (pic_syntax_p(car)) { switch (pic_syntax(car)->kind) { case PIC_STX_DEFLIBRARY: { - pic_value program; - struct pic_lib *prev = pic->lib, *lib; + pic_value exprs; + struct pic_lib *prev = pic->lib; if (pic_length(pic, expr) < 2) { pic_error(pic, "syntax error"); } - lib = pic_make_library(pic, pic_cadr(pic, expr)); + pic_make_library(pic, pic_cadr(pic, expr)); - /* macroexpand in new library */ + /* proceed expressions in new library */ pic_in_library(pic, pic_cadr(pic, expr)); { - program = macroexpand_list(pic, pic_cddr(pic, expr), lib->senv); + struct pic_proc *proc; + + for (exprs = pic_cddr(pic, expr); ! pic_nil_p(exprs); exprs = pic_cdr(pic, exprs)) { + v = pic_car(pic, exprs); + + proc = pic_codegen(pic, v); + if (proc == NULL) { + abort(); + } + pic_apply_argv(pic, proc, 0); + if (pic_undef_p(v)) { + abort(); + } + } } pic_in_library(pic, prev->name); - return pic_cons(pic, pic_symbol_value(pic->sBEGIN), program); + return pic_false_value(); } case PIC_STX_IMPORT: { struct pic_lib *lib;