(in env.ps\n) print % outer binds exprs -> env_new -> new_env /env_new { 3 dict begin %(in env_new\n) print /exprs exch dup _sequential? { /data get }{ pop [ ] } ifelse def /binds exch dup _sequential? { /data get }{ pop [ ] } ifelse def /outer exch def << /__outer__ outer 0 1 binds length 1 sub { /idx exch def binds idx get (&) eq { %if & binds idx 1 add get % key exprs idx exprs length idx sub getinterval % value _list_from_array exit } if binds idx get % key exprs idx get % value } for >> end } def /env_find { 2 dict begin /key exch def /env exch def env key known { %if key in env env }{ env /__outer__ get null ne { %elseif __outer__ not null env /__outer__ get key env_find }{ %else null } ifelse } ifelse end } def /env_set { 4 dict begin dup /func? exch xcheck def % executable function /val exch cvlit def /key exch def /env exch def env key val func? { cvx } if put val func? { cvx } if end } def /env_get { 2 dict begin /key exch def /env exch def env key env_find dup null eq { (') key dup length string cvs (' not found) concatenate concatenate _throw }{ key get } ifelse end } def