|
- /* Ast_Node* apply_to_lambda () {} */
-
- /* Ast_Node* apply_to_built_in (Ast_Node* function, Ast_Node* arguments) { */
-
- /* } */
-
- Ast_Node* eval_expr(Ast_Node* node, Environment* env);
-
- void eval_operands(Ast_Node* operands, Environment* env) {
- while (1) {
- if (operands->type == Ast_Node_Type_Cons_Cell) {
- operands->value.cons_cell->first = eval_expr(operands->value.cons_cell->first, env);
- operands = operands->value.cons_cell->rest;
- } else {
- break;
- }
- }
- }
-
- Ast_Node* eval_expr(Ast_Node* node, Environment* env) {
- Ast_Node* ret = new(Ast_Node);
- switch (node->type) {
- case Ast_Node_Type_Nil:
- ret->type = Ast_Node_Type_Nil;
- return ret;
- case Ast_Node_Type_Symbol:
- return lookup_symbol(node->value.symbol, env);
- case Ast_Node_Type_Number:
- case Ast_Node_Type_String:
- return node;
-
- case Ast_Node_Type_Cons_Cell: {
- Ast_Node* operator = eval_expr(node->value.cons_cell->first, env);
- Ast_Node* operands = node->value.cons_cell->rest;
-
- // check for built ins functions
- if (operator->type == Ast_Node_Type_Built_In_Function) {
- char* operator_name = operator->value.built_in_function->identifier;
- if (string_equal("quote", operator_name)) {
- return node->value.cons_cell->rest;
- } else if (string_equal("+", operator_name)) {
- eval_operands(operands, env);
- return built_in_add(operands);
- } else if (string_equal("-", operator_name)) {
- eval_operands(operands, env);
- return built_in_substract(operands);
- } else {
- log_message(Log_Level_Critical, "The operator is not yet implemented\n");
- }
- }
-
- // assume it's lambda function and evaluate the operands in
- // place
- eval_operands(operands, env);
- }
-
- default:
- return 0;
- }
- }
|