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); } }
static void evaluate(expression * e) { switch (e->type) { case expr_type_constant: evaluate_constant(e); break; case expr_type_variable: evaluate_variable(e); break; case expr_type_map: evaluate_map(e); break; case expr_type_function: evaluate_function(e); break; case expr_type_binding: evaluate_binding(e); break; default: G_fatal_error(_("Unknown type: %d"), e->type); } }