mirror of
https://github.com/kanaka/mal.git
synced 2024-09-21 02:27:10 +03:00
0b234e13a1
Fix Makefile stats/stats-lisp.
51 lines
1.3 KiB
Matlab
51 lines
1.3 KiB
Matlab
classdef Env < handle
|
|
properties
|
|
data
|
|
outer
|
|
end
|
|
methods
|
|
function env = Env(outer, binds, exprs)
|
|
env.data = containers.Map();
|
|
env.outer = outer;
|
|
|
|
if nargin > 1
|
|
env = Env(outer);
|
|
for i=1:length(binds)
|
|
k = binds.get(i).name;
|
|
if strcmp(k, '&')
|
|
env.data(binds.get(i+1).name) = exprs.slice(i);
|
|
break;
|
|
else
|
|
env.data(k) = exprs.get(i);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ret = set(env, k, v)
|
|
env.data(k.name) = v;
|
|
ret = v;
|
|
end
|
|
function ret = find(env, k)
|
|
if env.data.isKey(k.name)
|
|
ret = env;
|
|
else
|
|
if ~islogical(env.outer)
|
|
ret = env.outer.find(k);
|
|
else
|
|
ret = false;
|
|
end
|
|
end
|
|
end
|
|
function ret = get(env, k)
|
|
fenv = env.find(k);
|
|
if ~islogical(fenv)
|
|
ret = fenv.data(k.name);
|
|
else
|
|
throw(MException('ENV:notfound', ...
|
|
sprintf('''%s'' not found', k.name)));
|
|
end
|
|
end
|
|
end
|
|
end
|