2323-export ([run /1 , start /0 , eval /1 , put_vars /1 ]).
2424
2525start () ->
26- run (" (let ((y -1))
27- (do ((i 0 (+ 1 i))) ((> i 2) y)
28- (let ((x (+ 39 1)))
29- (cond
30- ((= (+ 7 (+ (quote 5) 2)) 13) (0))
31- ((= 1 1) (setq y (+ x i)))
32- ((= 1 0) (-1))))))" ).
26+ run (
27+ " (let ((y -1))\n "
28+ " (do ((i 0 (+ 1 i))) ((> i 2) y)\n "
29+ " (let ((x (+ 39 1)))\n "
30+ " (cond\n "
31+ " ((= (+ 7 (+ (quote 5) 2)) 13) (0))\n "
32+ " ((= 1 1) (setq y (+ x i)))\n "
33+ " ((= 1 0) (-1))))))"
34+ ).
3335
3436run (S ) ->
3537 L = sexp_lexer :string (S ),
@@ -41,54 +43,43 @@ eval(S) when is_atom(S) ->
4143 undefined -> throw (unbound );
4244 Val -> Val
4345 end ;
44-
4546eval (I ) when is_integer (I ) ->
4647 I ;
47-
4848eval ([do , Vars , [_TestExpr , _ReturnExpr ] | _Exprs ] = Do ) ->
4949 Restore = put_do_vars (Vars ),
5050 execute_do (Do , Restore );
51-
5251eval (['let' , Vars | Exprs ]) ->
5352 Restore = put_vars (Vars ),
5453 Res = eval_list (Exprs ),
5554 _ = delete_vars (Vars ),
5655 _ = restore_vars (Restore ),
5756 Res ;
58-
5957eval ([quote , Args ]) ->
6058 Args ;
61-
6259eval (['cond' | Exps ]) ->
6360 eval_cond_tests (Exps );
64-
6561eval (['progn' | Exprs ]) ->
6662 eval_list (Exprs );
67-
6863eval (['setq' , Name , Expr ]) ->
6964 Val = eval (Expr ),
7065 put (Name , Val ),
7166 Val ;
72-
7367eval ([Fn | Args ]) when is_atom (Fn ) ->
7468 EvaluatedArgs = eval_args (Args ),
7569 func_eval (Fn , EvaluatedArgs ).
7670
7771func_eval ('=' , [Arg1 , Arg2 ]) ->
7872 Arg1 == Arg2 ;
79-
8073func_eval (Fn , EvaluatedArgs ) ->
8174 fapply (erlang , Fn , EvaluatedArgs ).
8275
8376eval_args ([]) ->
8477 [];
85-
8678eval_args ([A | T ]) ->
8779 [eval (A ) | eval_args (T )].
8880
8981eval_cond_tests ([]) ->
9082 [];
91-
9283eval_cond_tests ([[Test , Action ] | T ]) ->
9384 case eval (Test ) of
9485 true -> eval (Action );
@@ -97,17 +88,14 @@ eval_cond_tests([[Test, Action] | T]) ->
9788
9889eval_list ([]) ->
9990 [];
100-
10191eval_list ([Exp ]) ->
10292 eval (Exp );
103-
10493eval_list ([Exp | T ]) ->
10594 eval (Exp ),
10695 eval_list (T ).
10796
10897put_vars ([]) ->
10998 [];
110-
11199put_vars ([[Name , Expr ] | T ]) ->
112100 Val = eval (Expr ),
113101 case put (Name , Val ) of
@@ -117,7 +105,6 @@ put_vars([[Name, Expr] | T]) ->
117105
118106put_do_vars ([]) ->
119107 [];
120-
121108put_do_vars ([[Name , Expr , _UpdateExpr ] | T ]) ->
122109 Val = eval (Expr ),
123110 case put (Name , Val ) of
@@ -127,28 +114,24 @@ put_do_vars([[Name, Expr, _UpdateExpr] | T]) ->
127114
128115delete_vars ([]) ->
129116 ok ;
130-
131117delete_vars ([[Name , _Val ] | T ]) ->
132118 erase (Name ),
133119 delete_vars (T ).
134120
135121delete_do_vars ([]) ->
136122 ok ;
137-
138123delete_do_vars ([[Name , _Val , _UpdateExpr ] | T ]) ->
139124 erase (Name ),
140125 delete_do_vars (T ).
141126
142127restore_vars ([]) ->
143128 ok ;
144-
145129restore_vars ([{Name , Val } | T ]) ->
146130 _ = put (Name , Val ),
147131 restore_vars (T ).
148132
149133do_update_vars ([]) ->
150134 [];
151-
152135do_update_vars ([[Name , _Expr , UpdateExpr ] | T ]) ->
153136 Val = eval (UpdateExpr ),
154137 _ = put (Name , Val ),
@@ -183,5 +166,6 @@ fapply(Module, Function, Args) ->
183166 Module :Function (Arg1 , Arg2 , Arg3 , Arg4 , Arg5 );
184167 [Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 ] ->
185168 Module :Function (Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 );
186- _ -> throw (badarg )
169+ _ ->
170+ throw (badarg )
187171 end .
0 commit comments