選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

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