Commit | Line | Data |
---|---|---|
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 | |
32 | end } 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 | |
47 | end } def | |
48 | ||
49 | ||
50 | ||
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 | |
87 | quit |