PS: add step5_tco.
[jackhill/mal.git] / ps / step2_eval.ps
CommitLineData
55e2bfa8
JM
1(types.ps) run
2(reader.ps) run
3
4% read
5/READ {
6 /str exch def
7 str read_str
8} def
9
10
11% eval
12/eval_ast { 2 dict begin
13 /env exch def
14 /ast exch def
04517bc8 15 %(eval_ast: ) print ast ==
55e2bfa8 16 /nametype ast type eq { %if symbol
aef93ea3
JM
17 env ast known {
18 env ast get
19 }{
20 (') ast pr_str (' not found)
21 concatenate concatenate throw
22 } ifelse
55e2bfa8
JM
23 }{ /arraytype ast type eq { %elseif list
24 [
25 ast {
26 env EVAL
27 } forall
28 ]
29 }{ % else
30 ast
31 } ifelse } ifelse
32end } def
33
04517bc8 34/EVAL { 3 dict begin
55e2bfa8
JM
35 /env exch def
36 /ast exch def
04517bc8 37 %(EVAL: ) print ast ==
55e2bfa8
JM
38 /arraytype ast type ne { %if not a list
39 ast env eval_ast
40 }{ %else apply the list
41 /el ast env eval_ast def
04517bc8
JM
42 el _rest % args array
43 el _first % function
55e2bfa8
JM
44 %(vvv\n) print pstack (^^^\n) print
45 exec % apply function to args
46 } ifelse
47end } def
48
49
50% print
51/PRINT {
0a2c6954 52 true _pr_str
55e2bfa8
JM
53} def
54
55
56% repl
57/repl_env <<
58 (+) { dup 0 get exch 1 get add }
59 (-) { dup 0 get exch 1 get sub }
60 (*) { dup 0 get exch 1 get mul }
61 (/) { dup 0 get exch 1 get idiv }
62>> def
63
04517bc8 64/REP { READ repl_env EVAL PRINT } def
55e2bfa8
JM
65
66/stdin (%stdin) (r) file def
67
68{ % loop
69 (user> ) print flush
70
55e2bfa8
JM
71 stdin 99 string readline
72
73 not { exit } if % exit if EOF
74
75 %(\ngot line: ) print dup print (\n) print flush
0a2c6954 76
aef93ea3
JM
77 { %try
78 REP print (\n) print
79 } stopped {
80 (Error: ) print
0a2c6954 81 get_error_data false _pr_str print (\n) print
aef93ea3
JM
82 clear
83 } if
55e2bfa8
JM
84} bind loop
85
86(\n) print % final newline before exit for cleanliness
87quit