From c6c1c00c5839fe838d9ec45312af8b86c062bfa9 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Thu, 26 Mar 2009 00:15:47 +0900 Subject: [PATCH] definitions working --- eval.c | 16 ++++++++-------- sexp.h | 5 +++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/eval.c b/eval.c index 929c8206..b0160045 100644 --- a/eval.c +++ b/eval.c @@ -186,10 +186,10 @@ static sexp sexp_make_set(sexp var, sexp value) { return res; } -static sexp sexp_make_ref(sexp name, sexp loc) { +static sexp sexp_make_ref(sexp name, sexp cell) { sexp res = sexp_alloc_type(ref, SEXP_REF); sexp_ref_name(res) = name; - sexp_ref_loc(res) = loc; + sexp_ref_cell(res) = cell; return res; } @@ -378,7 +378,7 @@ sexp analyze_app (sexp x, sexp env) { sexp analyze_define (sexp x, sexp env) { sexp ref, name, value; name = (sexp_pairp(sexp_cadr(x)) ? sexp_caadr(x) : sexp_cadr(x)); - if (sexp_lambdap(sexp_env_lambda(env))) + if (sexp_env_lambda(env) && sexp_lambdap(sexp_env_lambda(env))) sexp_push(sexp_lambda_locals(sexp_env_lambda(env)), name); if (sexp_pairp(sexp_cadr(x))) value = analyze_lambda(sexp_cons(SEXP_UNDEF, @@ -395,7 +395,7 @@ sexp analyze_define (sexp x, sexp env) { sexp analyze_var_ref (sexp x, sexp env) { sexp cell = env_cell_create(env, x, SEXP_UNDEF); - return sexp_make_ref(x, sexp_cdr(cell)); + return sexp_make_ref(x, cell); } sexp analyze_set (sexp x, sexp env) { @@ -492,7 +492,7 @@ void compile_ref (sexp ref, sexp context, int unboxp) { sexp lam; if (! sexp_lambdap(sexp_ref_loc(ref))) { /* global ref */ - emit_push(ref, context); + emit_push(sexp_ref_cell(ref), context); emit(OP_CDR, context); } else { lam = sexp_context_lambda(context); @@ -501,10 +501,10 @@ void compile_ref (sexp ref, sexp context, int unboxp) { } } -void compile_non_global_ref (sexp name, sexp loc, sexp lambda, sexp fv, +void compile_non_global_ref (sexp name, sexp cell, sexp lambda, sexp fv, sexp context, int unboxp) { - sexp ls; sexp_uint_t i; + sexp ls, loc = sexp_cdr(cell); if (loc == lambda) { /* local ref */ emit(OP_LOCAL_REF, context); @@ -528,7 +528,7 @@ void compile_set (sexp set, sexp context) { compile_one(sexp_set_value(set), context); if (! sexp_lambdap(sexp_ref_loc(ref))) { /* global vars are set directly */ - emit_push(ref, context); + emit_push(sexp_ref_cell(ref), context); } else { /* stack or closure mutable vars are boxed */ compile_ref(ref, context, 0); diff --git a/sexp.h b/sexp.h index 84c83a5e..6ca35e0b 100644 --- a/sexp.h +++ b/sexp.h @@ -143,7 +143,7 @@ struct sexp_struct { sexp var, value; } set; struct { - sexp name, loc; + sexp name, cell; } ref; struct { sexp ls; @@ -313,7 +313,8 @@ struct sexp_struct { #define sexp_set_value(x) ((x)->value.set.value) #define sexp_ref_name(x) ((x)->value.ref.name) -#define sexp_ref_loc(x) ((x)->value.ref.loc) +#define sexp_ref_cell(x) ((x)->value.ref.cell) +#define sexp_ref_loc(x) (sexp_cdr(sexp_ref_cell(x))) #define sexp_seq_ls(x) ((x)->value.seq.ls)