definitions working

This commit is contained in:
Alex Shinn 2009-03-26 00:15:47 +09:00
parent ab82735500
commit c6c1c00c58
2 changed files with 11 additions and 10 deletions

16
eval.c
View file

@ -186,10 +186,10 @@ static sexp sexp_make_set(sexp var, sexp value) {
return res; 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 res = sexp_alloc_type(ref, SEXP_REF);
sexp_ref_name(res) = name; sexp_ref_name(res) = name;
sexp_ref_loc(res) = loc; sexp_ref_cell(res) = cell;
return res; return res;
} }
@ -378,7 +378,7 @@ sexp analyze_app (sexp x, sexp env) {
sexp analyze_define (sexp x, sexp env) { sexp analyze_define (sexp x, sexp env) {
sexp ref, name, value; sexp ref, name, value;
name = (sexp_pairp(sexp_cadr(x)) ? sexp_caadr(x) : sexp_cadr(x)); 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); sexp_push(sexp_lambda_locals(sexp_env_lambda(env)), name);
if (sexp_pairp(sexp_cadr(x))) if (sexp_pairp(sexp_cadr(x)))
value = analyze_lambda(sexp_cons(SEXP_UNDEF, 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 analyze_var_ref (sexp x, sexp env) {
sexp cell = env_cell_create(env, x, SEXP_UNDEF); 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) { sexp analyze_set (sexp x, sexp env) {
@ -492,7 +492,7 @@ void compile_ref (sexp ref, sexp context, int unboxp) {
sexp lam; sexp lam;
if (! sexp_lambdap(sexp_ref_loc(ref))) { if (! sexp_lambdap(sexp_ref_loc(ref))) {
/* global ref */ /* global ref */
emit_push(ref, context); emit_push(sexp_ref_cell(ref), context);
emit(OP_CDR, context); emit(OP_CDR, context);
} else { } else {
lam = sexp_context_lambda(context); 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 context, int unboxp) {
sexp ls;
sexp_uint_t i; sexp_uint_t i;
sexp ls, loc = sexp_cdr(cell);
if (loc == lambda) { if (loc == lambda) {
/* local ref */ /* local ref */
emit(OP_LOCAL_REF, context); emit(OP_LOCAL_REF, context);
@ -528,7 +528,7 @@ void compile_set (sexp set, sexp context) {
compile_one(sexp_set_value(set), context); compile_one(sexp_set_value(set), context);
if (! sexp_lambdap(sexp_ref_loc(ref))) { if (! sexp_lambdap(sexp_ref_loc(ref))) {
/* global vars are set directly */ /* global vars are set directly */
emit_push(ref, context); emit_push(sexp_ref_cell(ref), context);
} else { } else {
/* stack or closure mutable vars are boxed */ /* stack or closure mutable vars are boxed */
compile_ref(ref, context, 0); compile_ref(ref, context, 0);

5
sexp.h
View file

@ -143,7 +143,7 @@ struct sexp_struct {
sexp var, value; sexp var, value;
} set; } set;
struct { struct {
sexp name, loc; sexp name, cell;
} ref; } ref;
struct { struct {
sexp ls; sexp ls;
@ -313,7 +313,8 @@ struct sexp_struct {
#define sexp_set_value(x) ((x)->value.set.value) #define sexp_set_value(x) ((x)->value.set.value)
#define sexp_ref_name(x) ((x)->value.ref.name) #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) #define sexp_seq_ls(x) ((x)->value.seq.ls)