forth: Add . interop special operator and tests
[jackhill/mal.git] / matlab / Env.m
1 classdef Env < handle
2 properties
3 data
4 outer
5 end
6 methods
7 function env = Env(outer, binds, exprs)
8 env.data = containers.Map();
9 env.outer = outer;
10
11 if nargin > 1
12 env = Env(outer);
13 for i=1:length(binds)
14 k = binds.get(i).name;
15 if strcmp(k, '&')
16 env.data(binds.get(i+1).name) = exprs.slice(i);
17 break;
18 else
19 env.data(k) = exprs.get(i);
20 end
21 end
22 end
23 end
24
25 function ret = set(env, k, v)
26 env.data(k.name) = v;
27 ret = v;
28 end
29 function ret = find(env, k)
30 if env.data.isKey(k.name)
31 ret = env;
32 else
33 if ~islogical(env.outer)
34 ret = env.outer.find(k);
35 else
36 ret = false;
37 end
38 end
39 end
40 function ret = get(env, k)
41 fenv = env.find(k);
42 if ~islogical(fenv)
43 ret = fenv.data(k.name);
44 else
45 throw(MException('ENV:notfound', ...
46 sprintf('''%s'' not found', k.name)));
47 end
48 end
49 end
50 end