diff --git a/codegen.c b/codegen.c index c1264dfb..55d7a50c 100644 --- a/codegen.c +++ b/codegen.c @@ -51,8 +51,8 @@ static void pop_scope(analyze_state *); #define register_renamed_symbol(pic, state, slot, lib, id) do { \ pic_sym sym, gsym; \ sym = pic_intern_cstr(pic, id); \ - if (! pic_find_rename(pic, lib->env, sym, &gsym)) { \ - pic_error(pic, "internal error! native VM procedure not found"); \ + if (! pic_find_rename(pic, lib->env, sym, &gsym)) { \ + pic_errorf(pic, "internal error! native VM procedure not found: %s", id); \ } \ state->slot = gsym; \ } while (0) @@ -62,32 +62,28 @@ new_analyze_state(pic_state *pic) { analyze_state *state; xh_iter it; - struct pic_lib *stdlib, *listlib; state = pic_alloc(pic, sizeof(analyze_state)); state->pic = pic; state->scope = NULL; - stdlib = pic_find_library(pic, pic_read_cstr(pic, "(scheme base)")); - listlib = pic_find_library(pic, pic_read_cstr(pic, "(picrin base list)")); - /* native VM procedures */ - register_renamed_symbol(pic, state, rCONS, listlib, "cons"); - register_renamed_symbol(pic, state, rCAR, listlib, "car"); - register_renamed_symbol(pic, state, rCDR, listlib, "cdr"); - register_renamed_symbol(pic, state, rNILP, listlib, "null?"); - register_renamed_symbol(pic, state, rADD, stdlib, "+"); - register_renamed_symbol(pic, state, rSUB, stdlib, "-"); - register_renamed_symbol(pic, state, rMUL, stdlib, "*"); - register_renamed_symbol(pic, state, rDIV, stdlib, "/"); - register_renamed_symbol(pic, state, rEQ, stdlib, "="); - register_renamed_symbol(pic, state, rLT, stdlib, "<"); - register_renamed_symbol(pic, state, rLE, stdlib, "<="); - register_renamed_symbol(pic, state, rGT, stdlib, ">"); - register_renamed_symbol(pic, state, rGE, stdlib, ">="); - register_renamed_symbol(pic, state, rNOT, stdlib, "not"); - register_renamed_symbol(pic, state, rVALUES, stdlib, "values"); - register_renamed_symbol(pic, state, rCALL_WITH_VALUES, stdlib, "call-with-values"); + register_renamed_symbol(pic, state, rCONS, pic->PICRIN_BASE, "cons"); + register_renamed_symbol(pic, state, rCAR, pic->PICRIN_BASE, "car"); + register_renamed_symbol(pic, state, rCDR, pic->PICRIN_BASE, "cdr"); + register_renamed_symbol(pic, state, rNILP, pic->PICRIN_BASE, "null?"); + register_renamed_symbol(pic, state, rADD, pic->PICRIN_BASE, "+"); + register_renamed_symbol(pic, state, rSUB, pic->PICRIN_BASE, "-"); + register_renamed_symbol(pic, state, rMUL, pic->PICRIN_BASE, "*"); + register_renamed_symbol(pic, state, rDIV, pic->PICRIN_BASE, "/"); + register_renamed_symbol(pic, state, rEQ, pic->PICRIN_BASE, "="); + register_renamed_symbol(pic, state, rLT, pic->PICRIN_BASE, "<"); + register_renamed_symbol(pic, state, rLE, pic->PICRIN_BASE, "<="); + register_renamed_symbol(pic, state, rGT, pic->PICRIN_BASE, ">"); + register_renamed_symbol(pic, state, rGE, pic->PICRIN_BASE, ">="); + register_renamed_symbol(pic, state, rNOT, pic->PICRIN_BASE, "not"); + register_renamed_symbol(pic, state, rVALUES, pic->PICRIN_BASE, "values"); + register_renamed_symbol(pic, state, rCALL_WITH_VALUES, pic->PICRIN_BASE, "call-with-values"); register_symbol(pic, state, sCALL, "call"); register_symbol(pic, state, sTAILCALL, "tail-call"); diff --git a/include/picrin.h b/include/picrin.h index 083cfcda..9ba312ef 100644 --- a/include/picrin.h +++ b/include/picrin.h @@ -137,8 +137,8 @@ pic_state *pic_open(int argc, char *argv[], char **envp); void pic_close(pic_state *); void pic_define(pic_state *, const char *, pic_value); /* automatic export */ -pic_value pic_ref(pic_state *, const char *); -void pic_set(pic_state *, const char *, pic_value); +pic_value pic_ref(pic_state *, struct pic_lib *, const char *); +void pic_set(pic_state *, struct pic_lib *, const char *, pic_value); pic_value pic_funcall(pic_state *pic, const char *name, pic_list args); diff --git a/port.c b/port.c index 0a6c6c1b..b8a15154 100644 --- a/port.c +++ b/port.c @@ -28,7 +28,7 @@ pic_stdin(pic_state *pic) { struct pic_proc *proc; - proc = pic_proc_ptr(pic_ref(pic, "current-input-port")); + proc = pic_proc_ptr(pic_ref(pic, pic->PICRIN_BASE, "current-input-port")); return pic_port_ptr(pic_apply(pic, proc, pic_nil_value())); } @@ -38,7 +38,7 @@ pic_stdout(pic_state *pic) { struct pic_proc *proc; - proc = pic_proc_ptr(pic_ref(pic, "current-output-port")); + proc = pic_proc_ptr(pic_ref(pic, pic->PICRIN_BASE, "current-output-port")); return pic_port_ptr(pic_apply(pic, proc, pic_nil_value())); } diff --git a/vm.c b/vm.c index 6d843d67..d25a2656 100644 --- a/vm.c +++ b/vm.c @@ -426,14 +426,14 @@ pic_define(pic_state *pic, const char *name, pic_value val) } pic_value -pic_ref(pic_state *pic, const char *name) +pic_ref(pic_state *pic, struct pic_lib *lib, const char *name) { pic_sym sym, rename; sym = pic_intern_cstr(pic, name); - if (! pic_find_rename(pic, pic->lib->env, sym, &rename)) { - pic_errorf(pic, "symbol \"%s\" not defined", name); + if (! pic_find_rename(pic, lib->env, sym, &rename)) { + pic_errorf(pic, "symbol \"%s\" not defined in library ~s", name, lib->name); } return xh_val(xh_get_int(&pic->globals, rename), pic_value); @@ -444,7 +444,7 @@ pic_funcall(pic_state *pic, const char *name, pic_list args) { pic_value proc; - proc = pic_ref(pic, name); + proc = pic_ref(pic, pic->lib, name); pic_assert_type(pic, proc, proc);