Add cons and concat to core
[jackhill/mal.git] / elixir / lib / mix / tasks / step4_if_fn_do.ex
index 1e34b64..b546468 100644 (file)
@@ -43,21 +43,21 @@ defmodule Mix.Tasks.Step4IfFnDo do
   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
@@ -97,7 +97,7 @@ defmodule Mix.Tasks.Step4IfFnDo 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)