defp eval_list([{:symbol, "try*"}, try_form, {:list, catch_list, _meta}], env, _) do
eval_try(try_form, catch_list, env)
end
+ defp eval_list([{:symbol, "try*"}, try_form], env, _) do
+ eval(try_form, env)
+ end
defp eval_list([{:symbol, "try*"}, _try_form, _], _env, _) do
throw({:error, "try* requires a list as the second parameter"})
end
defp eval_list([{:symbol, "try*"}, try_form, {:list, catch_list, _meta}], env, _) do
eval_try(try_form, catch_list, env)
end
+ defp eval_list([{:symbol, "try*"}, try_form], env, _) do
+ eval(try_form, env)
+ end
defp eval_list([{:symbol, "try*"}, _try_form, _], _env, _) do
throw({:error, "try* requires a list as the second parameter"})
end
evalTry : List MalExpr -> Eval MalExpr
evalTry args =
case args of
+ [ body ] ->
+ eval body
[ body, MalList [ MalSymbol "catch*", MalSymbol sym, handler ] ] ->
eval body
|> Eval.catchError
evalTry : List MalExpr -> Eval MalExpr
evalTry args =
case args of
+ [ body ] ->
+ eval body
[ body, MalList [ MalSymbol "catch*", MalSymbol sym, handler ] ] ->
eval body
|> Eval.catchError
env:bind(NewEnv, [B], [Reason]),
eval(C, NewEnv)
end;
+eval_list({list, [{symbol, "try*"}, AST], _Meta}, Env) ->
+ eval(AST, Env);
eval_list({list, [{symbol, "try*"}|_], _Meta}, _Env) ->
error("try*/catch* must be of the form (try* A (catch* B C))");
eval_list({list, List, Meta}, Env) ->
env:bind(NewEnv, [B], [Reason]),
eval(C, NewEnv)
end;
+eval_list({list, [{symbol, "try*"}, AST], _Meta}, Env) ->
+ eval(AST, Env);
eval_list({list, [{symbol, "try*"}|_], _Meta}, _Env) ->
error("try*/catch* must be of the form (try* A (catch* B C))");
eval_list({list, List, Meta}, Env) ->