|
|
|
@@ -640,11 +640,21 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { |
|
|
|
if (arguments_length < 2) { |
|
|
|
report_error(Error_Type_Wrong_Number_Of_Arguments); |
|
|
|
} |
|
|
|
Ast_Node* condition = arguments->value.pair->first; |
|
|
|
Ast_Node* condition_part = arguments->value.pair->first; |
|
|
|
Ast_Node* condition; |
|
|
|
Ast_Node* then_part = arguments->value.pair->rest; |
|
|
|
Ast_Node* result = create_ast_node_nil(); |
|
|
|
while (eval_expr(condition, env)->type != Ast_Node_Type_Nil) { |
|
|
|
result = eval_expr(then_part->value.pair->first, env); |
|
|
|
|
|
|
|
while (true) { |
|
|
|
try { |
|
|
|
condition = eval_expr(condition_part, env); |
|
|
|
} |
|
|
|
if (condition->type == Ast_Node_Type_Nil) { |
|
|
|
break; |
|
|
|
} |
|
|
|
try { |
|
|
|
result = eval_expr(then_part->value.pair->first, env); |
|
|
|
} |
|
|
|
} |
|
|
|
return result; |
|
|
|
|
|
|
|
@@ -684,6 +694,27 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { |
|
|
|
} |
|
|
|
return arguments->value.pair->first; |
|
|
|
} |
|
|
|
case Built_In_Try: { |
|
|
|
try { |
|
|
|
arguments_length = list_length(arguments); |
|
|
|
} |
|
|
|
if (arguments_length != 2) { |
|
|
|
report_error(Error_Type_Wrong_Number_Of_Arguments); |
|
|
|
} |
|
|
|
|
|
|
|
Ast_Node* try_part = arguments->value.pair->first; |
|
|
|
Ast_Node* catch_part = arguments->value.pair->rest->value.pair->first; |
|
|
|
Ast_Node* result; |
|
|
|
|
|
|
|
result = eval_expr(try_part, env); |
|
|
|
if (error) { |
|
|
|
delete_error(); |
|
|
|
try { |
|
|
|
result = eval_expr(catch_part, env); |
|
|
|
} |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
case Built_In_Macro_Define: |
|
|
|
case Built_In_Define: { |
|
|
|
try { |
|
|
|
|