12 /eval_ast
{ 2 dict begin
15 %(eval_ast: ) print ast ==
16 ast _symbol?
{ %if symbol
18 }{ ast _list?
{ %elseif list
32 %(EVAL: ) print ast ==
33 ast _list? not
{ %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 exec % apply function to args
70 /repl_env null
[ ] [ ] env_new def
72 /REP
{ READ repl_env EVAL PRINT
} def
73 /_ref
{ repl_env
3 1 roll env_set
pop } def
75 (+) { dup 0 get
exch 1 get add
} _ref
76 (-) { dup 0 get
exch 1 get
sub } _ref
77 (*) { dup 0 get
exch 1 get
mul } _ref
78 (/) { dup 0 get
exch 1 get
idiv } _ref
80 /stdin
(%stdin) (r) file def
85 stdin
99 string readline
87 not
{ exit } if % exit if EOF
89 %(\ngot line: ) print dup print (\n) print flush
95 get_error_data
false _pr_str print
(\n) print
100 (\n) print
% final newline before exit for cleanliness