Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

108 строки
3.7 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. int list_length(Ast_Node* node) {
  7. if (node->type != Ast_Node_Type_Pair) {
  8. create_error(Error_Type_Type_Missmatch, node);
  9. return 0;
  10. }
  11. return 1;
  12. }
  13. void eval_operands(Ast_Node* operands, Environment* env) {
  14. while (!error) {
  15. if (operands->type == Ast_Node_Type_Pair) {
  16. operands->value.pair->first = eval_expr(operands->value.pair->first, env);
  17. operands = operands->value.pair->rest;
  18. } else {
  19. return;
  20. }
  21. }
  22. }
  23. Ast_Node* eval_expr(Ast_Node* node, Environment* env) {
  24. #define report_error(_type) \
  25. create_error(_type, node); \
  26. return NULL
  27. Ast_Node* ret = new(Ast_Node);
  28. switch (node->type) {
  29. case Ast_Node_Type_Nil:
  30. ret->type = Ast_Node_Type_Nil;
  31. return ret;
  32. case Ast_Node_Type_Symbol:
  33. return lookup_symbol(node->value.symbol, env);
  34. case Ast_Node_Type_Number:
  35. case Ast_Node_Type_String:
  36. return node;
  37. case Ast_Node_Type_Pair: {
  38. Ast_Node* operator = eval_expr(node->value.pair->first, env);
  39. Ast_Node* operands = node->value.pair->rest;
  40. // check for built ins functions
  41. if (operator->type == Ast_Node_Type_Built_In_Function) {
  42. char* operator_name = operator->value.built_in_function->identifier;
  43. if (string_equal("quote", operator_name)) {
  44. return node->value.pair->rest;
  45. } else if (string_equal("+", operator_name)) {
  46. eval_operands(operands, env);
  47. return built_in_add(operands);
  48. } else if (string_equal("-", operator_name)) {
  49. eval_operands(operands, env);
  50. return built_in_substract(operands);
  51. } else if (string_equal("*", operator_name)) {
  52. eval_operands(operands, env);
  53. return built_in_multiply(operands);
  54. } else if (string_equal("/", operator_name)) {
  55. eval_operands(operands, env);
  56. return built_in_divide(operands);
  57. } else if (string_equal("if", operator_name)) {
  58. if (list_length(operands) != 3) {
  59. report_error(Error_Type_Wrong_Number_Of_Arguments);
  60. }
  61. Ast_Node* condition = operands->value.pair->first;
  62. Ast_Node* then_part = operands->value.pair->rest;
  63. Ast_Node* else_part = then_part->value.pair->rest;
  64. if (is_truthy(condition, env))
  65. return eval_expr(then_part->value.pair->first, env);
  66. else
  67. return eval_expr(else_part->value.pair->first, env);
  68. /* } else if (string_equal("not", operator_name)) { */
  69. /* } else if (string_equal("and", operator_name)) { */
  70. /* } else if (string_equal("or", operator_name)) { */
  71. } else {
  72. report_error(Error_Type_Not_Yet_Implemented);
  73. }
  74. }
  75. // assume it's lambda function and evaluate the operands in
  76. // place
  77. eval_operands(operands, env);
  78. }
  79. default:
  80. report_error(Error_Type_Unknown_Error);
  81. }
  82. #undef report_error
  83. }
  84. int is_truthy (Ast_Node* expression, Environment* env) {
  85. Ast_Node* result = eval_expr(expression, env);
  86. switch (result->type) {
  87. case Ast_Node_Type_Nil: return 0;
  88. case Ast_Node_Type_Number: return result->value.number->value != 0;
  89. default: return 1;
  90. }
  91. }