diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-06 15:23:40 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-06 15:23:40 -0500 |
| commit | 5ce65382cf4bdece30e9dee3f7765b698bd375e9 (patch) | |
| tree | 454089f5d1ea4ff1a2d78cf00e5c23397cac3065 /ps/env.ps | |
| parent | ea81a8087bcd7953b083a2be9db447f75e7ebf56 (diff) | |
| download | mal-5ce65382cf4bdece30e9dee3f7765b698bd375e9.tar.gz mal-5ce65382cf4bdece30e9dee3f7765b698bd375e9.zip | |
PS: add vector, hash-map, atoms and metadata.
As part of this lists switch from being a postscript array to being
a mal boxed type (dictionary with type in the /_maltype_ key).
Diffstat (limited to 'ps/env.ps')
| -rw-r--r-- | ps/env.ps | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/ps/env.ps b/ps/env.ps new file mode 100644 index 0000000..b8752af --- /dev/null +++ b/ps/env.ps @@ -0,0 +1,60 @@ +(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 |
