Skip to content

Commit b54cccc

Browse files
Rename :do_evaluate to :eval
1 parent 1e0ed3b commit b54cccc

File tree

1 file changed

+22
-27
lines changed

1 file changed

+22
-27
lines changed

lib/lisp_evaluator.ex

+22-27
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,51 @@
11
defmodule LispEvaluator do
22

3-
def evaluate(""), do: false
3+
def evaluate(""), do: false
4+
def evaluate(code), do: eval(LispParser.parse(code))
45

5-
def evaluate(code) do
6-
LispParser.parse(code)
7-
|> do_evaluate
6+
defp eval([h, t]) when is_list(h) and is_list(t) do
7+
[eval(h)] ++ eval(t)
88
end
99

10+
defp eval([elem]) when is_boolean(elem), do: elem
1011

11-
defp do_evaluate([h, t]) when is_list(h) and is_list(t) do
12-
[do_evaluate(h)] ++ do_evaluate(t)
12+
defp eval([:if, condition, do_clause, else_clause]) do
13+
if condition, do: eval(do_clause), else: eval(else_clause)
1314
end
1415

15-
defp do_evaluate([elem]) when is_boolean(elem), do: elem
16-
17-
defp do_evaluate([:if, condition, do_clause, else_clause]) do
18-
if condition, do: do_evaluate(do_clause), else: do_evaluate(else_clause)
19-
end
20-
21-
defp do_evaluate([:"/=", left, right]) do
16+
defp eval([:"/=", left, right]) do
2217
apply(Kernel, :!=, [left, right])
2318
end
2419

25-
defp do_evaluate([:concat, left, right]) when is_binary(left) and is_binary(right) do
20+
defp eval([:concat, left, right]) when is_binary(left) and is_binary(right) do
2621
left <> right
2722
end
2823

29-
defp do_evaluate([:concat, left, right]) when is_binary(left) do
30-
left <> do_evaluate(right)
24+
defp eval([:concat, left, right]) when is_binary(left) do
25+
left <> eval(right)
3126
end
3227

33-
defp do_evaluate([:concat, left, right]) when is_binary(right) do
34-
left <> do_evaluate(right)
28+
defp eval([:concat, left, right]) when is_binary(right) do
29+
left <> eval(right)
3530
end
3631

37-
defp do_evaluate([:to_string, arg]) do
38-
to_string(do_evaluate(arg))
32+
defp eval([:to_string, arg]) do
33+
to_string(eval(arg))
3934
end
4035

41-
defp do_evaluate([:puts, item]) when is_binary(item) do
36+
defp eval([:puts, item]) when is_binary(item) do
4237
IO.puts item
4338
end
4439

45-
defp do_evaluate([:puts, item]) do
46-
IO.puts do_evaluate(item)
40+
defp eval([:puts, item]) do
41+
IO.puts eval(item)
4742
end
4843

49-
defp do_evaluate([head|tail]) when is_atom(head) do
50-
apply(Kernel, head, Enum.map(tail, &do_evaluate(&1)))
44+
defp eval([head|tail]) when is_atom(head) do
45+
apply(Kernel, head, Enum.map(tail, &eval(&1)))
5146
end
5247

53-
defp do_evaluate([head|_]) do
48+
defp eval([head|_]) do
5449
case head do
5550
[[[value]]] -> value
5651
[[value]] -> value
@@ -59,5 +54,5 @@ defmodule LispEvaluator do
5954
end
6055
end
6156

62-
defp do_evaluate(elem), do: elem
57+
defp eval(elem), do: elem
6358
end

0 commit comments

Comments
 (0)