object *lookup_variable_value(object *var, object *env) { object *frame; object *vars; object *vals; if (debug) { fprintf(stderr, "entering lookup_variable_value searching for %s\n", var->data.symbol.value); } while (!is_the_empty_list(env)) { frame = first_frame(env); vars = frame_variables(frame); vals = frame_values(frame); if (debug) { fprintf(stderr, "1 searching symbol %s\n", var->data.symbol.value); fprintf(stderr, "1 vars %p\n", vars); } while (!is_the_empty_list(vars)) { if (is_pair(vars)) { if (var == car(vars)) { if (debug) { fprintf(stderr, "vals---\n"); write(stdout, is_pair(vals) ? car(vals) : the_empty_list); fflush(stdout); fprintf(stderr, "\nend---\n"); } return is_pair(vals) ? car(vals) : the_empty_list; } } else if(is_symbol(vars)) { if (debug) { fprintf(stderr, "2 searched symbol %s\n", var->data.symbol.value); fprintf(stderr, "last cdr symbol %s\n", vars->data.symbol.value); } if (var == vars) { if (debug) { fprintf(stderr, "vals---\n"); write(stdout, vals); fflush(stdout); fprintf(stderr, "\nend---\n"); } return vals; } else { break; } } vars = cdr(vars); vals = cdr(vals); } env = enclosing_environment(env); } fprintf(stderr, "unbound variable, %s\n", var->data.symbol.value); exit(1); }
static pSlipObject lookup_variable_value(pSlip gd, pSlipObject var, pSlipEnvironment env) { pSlipValue v; do { v = ScanForVar(var, env); if (v != NULL) return v->val; env = enclosing_environment(env); }while (env != NULL); throw_error(gd, "unbound variable %s for lookup\n", (char*)var->data.symbol.value); return NULL; }
static void set_variable_value(pSlip gd, pSlipObject var, pSlipObject val, pSlipEnvironment env) { pSlipValue v; do { v = ScanForVar(var, env); if (v != NULL) { v->val = val; return; } env = enclosing_environment(env); }while (env != NULL); throw_error(gd, "unbound variable %s for assignment\n", (char*)var->data.symbol.value); }
void set_variable_value(item unev, item val, item env){ item vars, vals; while (!eq(env, the_empty_environment())){ vars = frame_variables(first_frame(env)); vals = frame_value(first_frame(env)); while (1){ if (is_null(vars)){ env = enclosing_environment(env); break; } else if (eq(unev, car(vars))){ set_car(vals, val); } else { vars = cdr(vars); vals = cdr(vals); } } } }
item lookup_variable_value(item exp, item env){ item vars, vals; while (!eq(env, the_empty_environment())){ vars = frame_variables(first_frame(env)); vals = frame_value(first_frame(env)); while (1){ if (is_null(vars)){ env = enclosing_environment(env); break; } else if (eq(exp, car(vars))){ return car(vals); } else { vars = cdr(vars); vals = cdr(vals); } } } fprintf(stderr, "Unbound variable"); exit(1); }
void set_variable_value(object *var, object *val, object *env) { object *frame; object *vars; object *vals; object *prevals; while (!is_the_empty_list(env)) { frame = first_frame(env); vars = frame_variables(frame); vals = frame_values(frame); if (debug) { printf("\n---env\n"); write(stdout, env); printf("\n---frame\n"); write(stdout, frame); printf("\n---vars\n"); write(stdout, vars); printf("\n---vals\n"); write(stdout, vals); printf("\n---\n"); } while (!is_the_empty_list(vars)) { /* if (var == car(vars)) { */ /* set_car(vals, val); */ /* return; */ /* } */ if (is_pair(vars)) { // printf("ispair\n"); if (var == car(vars)) { if (debug) { printf("found match\n"); printf("\n---vals\n"); write(stdout, vals); } if (is_pair(vals)) { set_car(vals, val); return; } else /* TODO */ { set_cdr(prevals, cons(val, the_empty_list)); return; } } } else if(is_symbol(vars)) { if (debug) { printf("symbol\n"); fprintf(stderr, "2 searched symbol %s\n", var->data.symbol.value); fprintf(stderr, "last cdr symbol %s\n", vars->data.symbol.value); } if (var == vars) { if (debug) { printf("\n---vals\n"); write(stdout, vals); printf("\n---prevals\n"); write(stdout, prevals); } // assert(0); set_cdr(prevals, val); // return vals; return; } else { if (debug) { printf("\nx yes\n"); } // assert(0); break; } } vars = cdr(vars); prevals = vals; vals = cdr(vals); } env = enclosing_environment(env); } fprintf(stderr, "unbound variable, %s\n", var->data.symbol.value); exit(1); }