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); }
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); }
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); } }