Common Lisp: Add documentation
[jackhill/mal.git] / logo / step2_eval.lg
CommitLineData
4eb88ef2
DM
1load "../logo/readline.lg
2load "../logo/reader.lg
3load "../logo/printer.lg
4load "../logo/types.lg
5
6to _read :str
7output read_str :str
8end
9
10to eval_ast :ast :env
11output case (obj_type :ast) [
12 [[symbol] localmake "val hashmap_get :env :ast
13 if emptyp :val [(throw "error sentence (word "' obj_val :ast "' ) [not found])]
14 :val ]
15 [[list] obj_new "list map [_eval ? :env] obj_val :ast]
16 [[vector] obj_new "vector map [_eval ? :env] obj_val :ast]
17 [[hashmap] obj_new "hashmap map [_eval ? :env] obj_val :ast]
18 [else :ast]
19]
20end
21
22to _eval :ast :env
23if (obj_type :ast) <> "list [output eval_ast :ast :env]
24if emptyp obj_val :ast [output :ast]
25make "el obj_val eval_ast :ast :env
26output apply first :el butfirst :el
27end
28
29to _print :exp
30output pr_str :exp "true
31end
32
33to rep :str
34output _print _eval _read :str :repl_env
35end
36
37to mal_add :a :b
38output obj_new "number ((obj_val :a) + (obj_val :b))
39end
40
41to mal_sub :a :b
42output obj_new "number ((obj_val :a) - (obj_val :b))
43end
44
45to mal_mul :a :b
46output obj_new "number ((obj_val :a) * (obj_val :b))
47end
48
49to mal_div :a :b
50output obj_new "number ((obj_val :a) / (obj_val :b))
51end
52
53to repl
54localmake "running "true
55while [:running] [
56 localmake "line readline word "user> :space_char
57 ifelse :line=[] [
58 print "
59 make "running "false
60 ] [
61 if not emptyp :line [
62 catch "error [print rep :line]
63 localmake "exception error
64 if not emptyp :exception [
65 (print "Error: first butfirst :exception)
66 ]
67 ]
68 ]
69]
70end
71
72make "repl_env []
73make "repl_env hashmap_put :repl_env symbol_new "+ "mal_add
74make "repl_env hashmap_put :repl_env symbol_new "- "mal_sub
75make "repl_env hashmap_put :repl_env symbol_new "* "mal_mul
76make "repl_env hashmap_put :repl_env symbol_new "/ "mal_div
77repl
78bye