Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

61 Zeilen
1.9 KiB

  1. /* Ast_Node* apply_to_lambda () {} */
  2. /* Ast_Node* apply_to_built_in (Ast_Node* function, Ast_Node* arguments) { */
  3. /* } */
  4. Ast_Node* eval_expr(Ast_Node* node, Environment* env);
  5. void eval_operands(Ast_Node* operands, Environment* env) {
  6. while (1) {
  7. if (operands->type == Ast_Node_Type_Cons_Cell) {
  8. operands->value.cons_cell->first = eval_expr(operands->value.cons_cell->first, env);
  9. operands = operands->value.cons_cell->rest;
  10. } else {
  11. break;
  12. }
  13. }
  14. }
  15. Ast_Node* eval_expr(Ast_Node* node, Environment* env) {
  16. Ast_Node* ret = new(Ast_Node);
  17. switch (node->type) {
  18. case Ast_Node_Type_Nil:
  19. ret->type = Ast_Node_Type_Nil;
  20. return ret;
  21. case Ast_Node_Type_Symbol:
  22. return lookup_symbol(node->value.symbol, env);
  23. case Ast_Node_Type_Number:
  24. case Ast_Node_Type_String:
  25. return node;
  26. case Ast_Node_Type_Cons_Cell: {
  27. Ast_Node* operator = eval_expr(node->value.cons_cell->first, env);
  28. Ast_Node* operands = node->value.cons_cell->rest;
  29. // check for built ins functions
  30. if (operator->type == Ast_Node_Type_Built_In_Function) {
  31. char* operator_name = operator->value.built_in_function->identifier;
  32. if (string_equal("quote", operator_name)) {
  33. return node->value.cons_cell->rest;
  34. } else if (string_equal("+", operator_name)) {
  35. eval_operands(operands, env);
  36. return built_in_add(operands);
  37. } else if (string_equal("-", operator_name)) {
  38. eval_operands(operands, env);
  39. return built_in_substract(operands);
  40. } else {
  41. log_message(Log_Level_Critical, "The operator is not yet implemented\n");
  42. }
  43. }
  44. // assume it's lambda function and evaluate the operands in
  45. // place
  46. eval_operands(operands, env);
  47. }
  48. default:
  49. return 0;
  50. }
  51. }