Commit | Line | Data |
---|---|---|
5ce65382 JM |
1 | % outer binds exprs -> env_new -> new_env |
2 | /env_new { 3 dict begin | |
3 | %(in env_new\n) print | |
4 | /exprs exch dup _sequential? { /data get }{ pop [ ] } ifelse def | |
5 | /binds exch dup _sequential? { /data get }{ pop [ ] } ifelse def | |
6 | /outer exch def | |
7 | << | |
8 | /__outer__ outer | |
9 | 0 1 binds length 1 sub { | |
10 | /idx exch def | |
11 | binds idx get (&) eq { %if & | |
12 | binds idx 1 add get % key | |
13 | exprs idx exprs length idx sub getinterval % value | |
14 | _list_from_array | |
15 | exit | |
16 | } if | |
17 | binds idx get % key | |
18 | exprs idx get % value | |
19 | } for | |
20 | >> | |
21 | end } def | |
22 | ||
0027e8fe JM |
23 | % env key -> env_find -> env |
24 | % env key -> env_find -> null | |
5ce65382 JM |
25 | /env_find { 2 dict begin |
26 | /key exch def | |
27 | /env exch def | |
28 | env key known { %if key in env | |
29 | env | |
30 | }{ env /__outer__ get null ne { %elseif __outer__ not null | |
31 | env /__outer__ get key env_find | |
32 | }{ %else | |
33 | null | |
34 | } ifelse } ifelse | |
35 | end } def | |
36 | ||
0027e8fe JM |
37 | % env key val -> env_set -> val |
38 | /env_set { | |
39 | dup 4 1 roll % stack: val env key val | |
40 | put % stack: val | |
41 | } def | |
5ce65382 | 42 | |
0027e8fe JM |
43 | /env_get { |
44 | dup 3 1 roll % stack: key env key | |
45 | env_find % stack: key env/null | |
5ce65382 | 46 | dup null eq { |
0027e8fe JM |
47 | pop % stack: key |
48 | (') exch % stack: (') key | |
49 | dup length string cvs | |
5ce65382 JM |
50 | (' not found) |
51 | concatenate concatenate | |
52 | _throw | |
53 | }{ | |
0027e8fe JM |
54 | exch % stack: env key |
55 | get | |
5ce65382 | 56 | } ifelse |
0027e8fe | 57 | } def |