end
defp eval_bindings(_bindings, _env), do: throw({:error, "Unbalanced let* bindings"})
- defp eval_if_false([], _env), do: nil
- defp eval_if_false([body], env), do: eval(body, env)
-
def eval([{:symbol, "if"}, condition, if_true | if_false], env) do
result = eval(condition, env)
if result == nil or result == false do
- eval_if_false(if_false, env)
+ case if_false do
+ [] -> nil
+ [body] -> eval(body, env)
+ end
else
eval(if_true, env)
end
end
def eval([{:symbol, "do"} | ast], env) do
- eval_ast(ast, env)
- |> List.last
+ eval_ast(List.delete_at(ast, -1), env)
+ eval(List.last(ast), env)
end
def eval([{:symbol, "def!"}, {:symbol, key}, value], env) do
IO.puts(Mal.Printer.print_str(value))
end
- def read_eval_print(:eof, _env), do: exit(0)
+ def read_eval_print(:eof, _env), do: exit(:normal)
def read_eval_print(line, env) do
read(line)
|> eval(env)