aboutsummaryrefslogtreecommitdiff
path: root/lua/env.lua
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