Ejemplo n.º 1
0
static Lexeme * evaluate_expression_list(Lexeme * tree, Lexeme * env) {
    Lexeme * e = evaluate(car(tree), env);
    if (cdr(tree) == NULL)
        return e;
    else
        return evaluate_expression_list(cdr(tree), env);
}
Ejemplo n.º 2
0
static int evaluate_list_expression(struct expression *in,
				    struct expression *out, char **error)
{
	assert(in->type == EXPR_LIST);
	assert(out->type == EXPR_LIST);

	out->value.list = NULL;
	return evaluate_expression_list(in->value.list,
					&out->value.list, error);
}
Ejemplo n.º 3
0
Lexeme * evaluate(Lexeme * tree, Lexeme * env) {
    char * type = getType(tree);
    //fprintf(stdout, " >> ");  printOut(tree);
    if (is_a_primary(type)) {
        return tree;
    }
    else if (type == CLOSURE) {
        // If this is a new closure, link it to its defining scope (this one).
        if (get_closure_environment(tree) == NULL) {
            tree = set_closure_environment(tree, env);
        }
        return tree;
    }
    else if (type == IDENTIFIER) {
        return look_up(env, tree);
    }
    else if (type == CALL) {
        // Function calls are evaluated by the function evaluator module.
        return evaluate_function_call(tree, env);
    }
    else if (type == BUILT_IN) {
        // Built-ins are executed directly by the built-ins module.
        return execute(tree, env);
    }
    else if (type == BINDING) {
        return evaluate_binding(tree, env);
    }
    else if (type == REBINDING) {
        return evaluate_rebinding(tree, env);
    }
    else if (type == IF_CLAUSE) {
        return evaluate_if_control(tree, env);
    }
    else if (type == WHILE_LOOP) {
        return evaluate_while_control(tree, env);
    }
    //else if (type == FOR_LOOP) {
    //    return evaluate_for_control(tree, env);
    //}
    else if (type == EXPRESSION_LIST) {
        return evaluate_expression_list(tree, env);
    }
    else {
        fprintf(stderr, "Evaluation error: I don't know what to do with type <%s>.\n", type);
        exit(-1);
    }
}