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.
 
 
 
 
 
 

104 Zeilen
4.0 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. int is_truthy (Ast_Node* expression, Environment* env);
  6. void eval_operands(Ast_Node* operands, Environment* env) {
  7. while (!error) {
  8. if (operands->type == Ast_Node_Type_Cons_Cell) {
  9. operands->value.cons_cell->first = eval_expr(operands->value.cons_cell->first, env);
  10. operands = operands->value.cons_cell->rest;
  11. } else {
  12. return;
  13. }
  14. }
  15. // if we reach here we got an error
  16. log_error("An error occurred while evaluating operands to a function:");
  17. }
  18. Ast_Node* eval_expr(Ast_Node* node, Environment* env) {
  19. #define report_error(_message) \
  20. error = new(Error); \
  21. error->message = _message; \
  22. error->location = node; \
  23. return NULL
  24. Ast_Node* ret = new(Ast_Node);
  25. switch (node->type) {
  26. case Ast_Node_Type_Nil:
  27. ret->type = Ast_Node_Type_Nil;
  28. return ret;
  29. case Ast_Node_Type_Symbol:
  30. return lookup_symbol(node->value.symbol, env);
  31. case Ast_Node_Type_Number:
  32. case Ast_Node_Type_String:
  33. return node;
  34. case Ast_Node_Type_Cons_Cell: {
  35. Ast_Node* operator = eval_expr(node->value.cons_cell->first, env);
  36. Ast_Node* operands = node->value.cons_cell->rest;
  37. // check for built ins functions
  38. if (operator->type == Ast_Node_Type_Built_In_Function) {
  39. char* operator_name = operator->value.built_in_function->identifier;
  40. if (string_equal("quote", operator_name)) {
  41. return node->value.cons_cell->rest;
  42. } else if (string_equal("+", operator_name)) {
  43. eval_operands(operands, env);
  44. return built_in_add(operands);
  45. } else if (string_equal("-", operator_name)) {
  46. eval_operands(operands, env);
  47. return built_in_substract(operands);
  48. } else if (string_equal("*", operator_name)) {
  49. eval_operands(operands, env);
  50. return built_in_multiply(operands);
  51. } else if (string_equal("/", operator_name)) {
  52. eval_operands(operands, env);
  53. return built_in_divide(operands);
  54. } else if (string_equal("if", operator_name)) {
  55. if (Ast_Node_Type_Cons_Cell != operands->value.cons_cell->rest->type ||
  56. Ast_Node_Type_Cons_Cell != operands->value.cons_cell->rest->value.cons_cell->rest->type ||
  57. Ast_Node_Type_Nil != operands->value.cons_cell->rest->value.cons_cell->rest->value.cons_cell->rest->type)
  58. {
  59. report_error("Ill formed if statement");
  60. }
  61. Ast_Node* then_part = operands->value.cons_cell->rest;
  62. Ast_Node* else_part = then_part->value.cons_cell->rest;
  63. if (is_truthy(operands->value.cons_cell->first, env))
  64. return eval_expr(then_part->value.cons_cell->first, env);
  65. else
  66. return eval_expr(else_part->value.cons_cell->first, env);
  67. } else if (string_equal("not", operator_name)) {
  68. } else if (string_equal("and", operator_name)) {
  69. } else if (string_equal("or", operator_name)) {
  70. } else {
  71. report_error("The operator is not yet implemented");
  72. }
  73. }
  74. // assume it's lambda function and evaluate the operands in
  75. // place
  76. eval_operands(operands, env);
  77. }
  78. default:
  79. report_error("Unknown error");
  80. }
  81. #undef report_error
  82. }
  83. int is_truthy (Ast_Node* expression, Environment* env) {
  84. Ast_Node* result = eval_expr(expression, env);
  85. switch (result->type) {
  86. case Ast_Node_Type_Nil: return 0;
  87. case Ast_Node_Type_Number: return result->value.number->value != 0;
  88. default: return 1;
  89. }
  90. }