1
1
defmodule LispEvaluator do
2
2
3
- def evaluate ( "" ) , do: false
3
+ def evaluate ( "" ) , do: false
4
+ def evaluate ( code ) , do: eval ( LispParser . parse ( code ) )
4
5
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 )
8
8
end
9
9
10
+ defp eval ( [ elem ] ) when is_boolean ( elem ) , do: elem
10
11
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 )
13
14
end
14
15
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
22
17
apply ( Kernel , :!= , [ left , right ] )
23
18
end
24
19
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
26
21
left <> right
27
22
end
28
23
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 )
31
26
end
32
27
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 )
35
30
end
36
31
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 ) )
39
34
end
40
35
41
- defp do_evaluate ( [ :puts , item ] ) when is_binary ( item ) do
36
+ defp eval ( [ :puts , item ] ) when is_binary ( item ) do
42
37
IO . puts item
43
38
end
44
39
45
- defp do_evaluate ( [ :puts , item ] ) do
46
- IO . puts do_evaluate ( item )
40
+ defp eval ( [ :puts , item ] ) do
41
+ IO . puts eval ( item )
47
42
end
48
43
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 ) ) )
51
46
end
52
47
53
- defp do_evaluate ( [ head | _ ] ) do
48
+ defp eval ( [ head | _ ] ) do
54
49
case head do
55
50
[ [ [ value ] ] ] -> value
56
51
[ [ value ] ] -> value
@@ -59,5 +54,5 @@ defmodule LispEvaluator do
59
54
end
60
55
end
61
56
62
- defp do_evaluate ( elem ) , do: elem
57
+ defp eval ( elem ) , do: elem
63
58
end
0 commit comments