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