5 /_readline
{ print flush
(%stdin) (r) file 99 string readline } def
14 /eval_ast
{ 2 dict begin
17 %(eval_ast: ) print ast ==
18 ast _symbol?
{ %if symbol
20 }{ ast _list?
{ %elseif list
35 %(EVAL: ) print ast true _pr_str print (\n) print
36 ast _list? not
{ %if not a list
38 }{ %else apply the list
40 /def
! a0 eq
{ %if def!
43 env a1 a2 env EVAL env_set
44 }{ /let
* a0 eq
{ %if let*
47 /let_env env
[ ] [ ] env_new def
48 0 2 a1 length
1 sub { %for each pair
52 a1 idx
1 add get let_env EVAL
54 pop % discard the return value
58 /el ast env eval_ast def
59 el _rest el _first
% stack: ast function
60 exec % apply function to args
73 /repl_env null
[ ] [ ] env_new def
75 /REP
{ READ repl_env EVAL PRINT
} def
76 /_ref
{ repl_env
3 1 roll env_set
pop } def
78 (+) { dup 0 get
exch 1 get add
} _ref
79 (-) { dup 0 get
exch 1 get
sub } _ref
80 (*) { dup 0 get
exch 1 get
mul } _ref
81 (/) { dup 0 get
exch 1 get
idiv } _ref
85 not
{ exit } if % exit if EOF
91 get_error_data
false _pr_str print
(\n) print
92 $error
/newerror
false put
93 $error
/errorinfo null put
99 (\n) print
% final newline before exit for cleanliness