static data_t *scan_define(data_t *vars, data_t *vals, data_t *var, const data_t *val, data_t *frame) { if(vars == NULL) { return add_binding_to_frame(var, val, frame); } if(is_equal(var, car(vars))) { set_car(vals, val); return (data_t*)val; } return scan_define(cdr(vars), cdr(vals), var, val, frame); }
void define_variable(item unev, item val, item env){ item frame = first_frame(env); item vars, vals; vars = frame_variables(frame); vals = frame_value(frame); while (1){ if (is_null(vars)){ add_binding_to_frame(unev, val, frame); break; } else if (eq(unev, car(vars))){ set_car(vals, val); break; } else{ vars = cdr(vars); vals = cdr(vals); } } }
void define_variable(object *var, object *val, object *env) { object *frame; object *vars; object *vals; object *prevals; frame = first_frame(env); vars = frame_variables(frame); vals = frame_values(frame); 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 { assert(0); } } } 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 { printf("\nx yes\n"); // assert(0); break; } } vars = cdr(vars); prevals = vals; vals = cdr(vals); } add_binding_to_frame(var, val, frame); }