|
|
|
@@ -8,7 +8,7 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env); |
|
|
|
int is_truthy (Ast_Node* expression, Environment* env); |
|
|
|
|
|
|
|
int list_length(Ast_Node* node) { |
|
|
|
if (node->type != Ast_Node_Type_Nil) |
|
|
|
if (node->type == Ast_Node_Type_Nil) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if (node->type != Ast_Node_Type_Pair) { |
|
|
|
@@ -16,12 +16,16 @@ int list_length(Ast_Node* node) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int len = 1; |
|
|
|
while (1) { |
|
|
|
break; |
|
|
|
int len = 0; |
|
|
|
while (node->type == Ast_Node_Type_Pair) { |
|
|
|
++len; |
|
|
|
node = node->value.pair->rest; |
|
|
|
if (node->type == Ast_Node_Type_Nil) |
|
|
|
return len; |
|
|
|
} |
|
|
|
|
|
|
|
return len; |
|
|
|
create_error(Error_Type_Ill_Formed_List, node); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
void eval_operands(Ast_Node* operands, Environment* env) { |
|
|
|
@@ -36,8 +40,8 @@ void eval_operands(Ast_Node* operands, Environment* env) { |
|
|
|
} |
|
|
|
|
|
|
|
Ast_Node* eval_expr(Ast_Node* node, Environment* env) { |
|
|
|
#define report_error(_type) \ |
|
|
|
create_error(_type, node); \ |
|
|
|
#define report_error(_type) \ |
|
|
|
create_error(_type, node); \ |
|
|
|
return NULL |
|
|
|
|
|
|
|
Ast_Node* ret = new(Ast_Node); |
|
|
|
@@ -73,8 +77,10 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { |
|
|
|
eval_operands(operands, env); |
|
|
|
return built_in_divide(operands); |
|
|
|
} else if (string_equal("if", operator_name)) { |
|
|
|
if (list_length(operands) != 3) { |
|
|
|
report_error(Error_Type_Wrong_Number_Of_Arguments); |
|
|
|
int operands_length = list_length(operands); |
|
|
|
if (operands_length != 2 && operands_length != 3) { |
|
|
|
create_error(Error_Type_Wrong_Number_Of_Arguments, operands); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
Ast_Node* condition = operands->value.pair->first; |
|
|
|
@@ -83,12 +89,13 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { |
|
|
|
|
|
|
|
if (is_truthy(condition, env)) |
|
|
|
return eval_expr(then_part->value.pair->first, env); |
|
|
|
else |
|
|
|
else if (operands_length == 3) |
|
|
|
return eval_expr(else_part->value.pair->first, env); |
|
|
|
/* } else if (string_equal("not", operator_name)) { */ |
|
|
|
else return create_ast_node_nil(); |
|
|
|
/* } else if (string_equal("not", operator_name)) { */ |
|
|
|
|
|
|
|
/* } else if (string_equal("and", operator_name)) { */ |
|
|
|
/* } else if (string_equal("or", operator_name)) { */ |
|
|
|
/* } else if (string_equal("and", operator_name)) { */ |
|
|
|
/* } else if (string_equal("or", operator_name)) { */ |
|
|
|
} else { |
|
|
|
report_error(Error_Type_Not_Yet_Implemented); |
|
|
|
} |