Lua: all steps and self-hosting.
[jackhill/mal.git] / lua / env.lua
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