Commit | Line | Data |
---|---|---|
ab6e6fae JM |
1 | classdef Env < handle |
2 | properties | |
3 | data | |
4 | outer | |
5 | end | |
6 | methods | |
d6624158 | 7 | function env = Env(outer, binds, exprs) |
ab6e6fae JM |
8 | env.data = containers.Map(); |
9 | env.outer = outer; | |
d6624158 JM |
10 | |
11 | if nargin > 1 | |
12 | env = Env(outer); | |
13 | for i=1:length(binds) | |
14 | k = binds{i}.name; | |
15 | if strcmp(k, '&') | |
16 | env.data(binds{i+1}.name) = exprs(i:end); | |
17 | break; | |
18 | else | |
19 | env.data(k) = exprs{i}; | |
20 | end | |
21 | end | |
22 | end | |
ab6e6fae | 23 | end |
d6624158 | 24 | |
ab6e6fae JM |
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 | strcat('''', k.name, ''' not found'))); | |
47 | end | |
48 | end | |
49 | end | |
50 | end |