blob: ee19c90f31deefa08b0f59dba3a57a273cc81147 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
local rex = require('rex_pcre')
local string = require('string')
local table = require('table')
local utils = require('utils')
local types = require('types')
local Env = {}
function Env:new(outer, binds, exprs)
local data = {}
local newObj = {outer = outer, data = data}
self.__index = self
if binds then
for i, b in ipairs(binds) do
if binds[i].val == '&' then
local new_exprs = types.List:new()
for j = i, #exprs do
table.insert(new_exprs, exprs[j])
end
table.remove(exprs, 1)
data[binds[i+1].val] = new_exprs
break
end
data[binds[i].val] = exprs[i]
end
end
return setmetatable(newObj, self)
end
function Env:find(sym)
if self.data[sym.val] ~= nil then
return self
else
if self.outer ~= nil then
return self.outer:find(sym)
else
return nil
end
end
end
function Env:set(sym,val)
self.data[sym.val] = val
return val
end
function Env:get(sym)
local env = self:find(sym)
if env then
return env.data[sym.val]
else
types.throw("'"..sym.val.."' not found")
end
end
return Env
|