コード例 #1
0
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);
}
コード例 #2
0
ファイル: others.c プロジェクト: Csxy/SICP-Solutions
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);
		}
	}
}
コード例 #3
0
ファイル: model.c プロジェクト: sharad/bootstrap-scheme
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);
}