예제 #1
0
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);
}
예제 #2
0
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
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);
			}
		}
	}
}
예제 #4
0
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);
}
예제 #5
0
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);
}
예제 #6
0
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);
}