12 /eval_ast
{ 2 dict begin
15 %(eval_ast: ) print ast ==
16 /nametype ast type eq
{ %if symbol
18 }{ /arraytype ast type eq
{ %elseif list
32 %(EVAL: ) print ast ==
33 /arraytype ast type ne
{ %if not a list
35 }{ %else apply the list
37 /def
! a0 eq
{ %if def!
40 env a1 a2 env EVAL env_set
41 }{ /let
* a0 eq
{ %if let*
44 /let_env env
[ ] [ ] env_new def
45 0 2 a1 length
1 sub { %for each pair
49 a1 idx
1 add get let_env EVAL
54 /el ast env eval_ast def
56 el _first cvx
% function
57 %(vvv\n) print pstack (^^^\n) print
58 exec % apply function to args
71 /repl_env null
[ ] [ ] env_new def
73 /REP
{ READ repl_env EVAL PRINT
} def
74 /_ref
{ repl_env
3 1 roll env_set
pop } def
76 (+) { dup 0 get
exch 1 get add
} _ref
77 (-) { dup 0 get
exch 1 get
sub } _ref
78 (*) { dup 0 get
exch 1 get
mul } _ref
79 (/) { dup 0 get
exch 1 get
idiv } _ref
81 /stdin
(%stdin) (r) file def
86 stdin
99 string readline
88 not
{ exit } if % exit if EOF
90 %(\ngot line: ) print dup print (\n) print flush
96 get_error_data
false _pr_str print
(\n) print
101 (\n) print
% final newline before exit for cleanliness