vimscript: Remove calls to ObjValue
[jackhill/mal.git] / vimscript / env.vim
1 " env module
2
3 let Env = {}
4
5 function NewEnv(outer)
6 let e = copy(g:Env)
7 let e.data = {}
8 let e.outer = a:outer
9 return e
10 endfunction
11
12 function NewEnvWithBinds(outer, binds, exprs)
13 let env = NewEnv(a:outer)
14 let i = 0
15 while i < ListCount(a:binds)
16 let varname = ListNth(a:binds, i).val
17 if varname == "&"
18 " TODO
19 let restvarname = ListNth(a:binds, i + 1).val
20 let restvarvalues = ListDrop(a:exprs, i)
21 call env.set(restvarname, restvarvalues)
22 break
23 else
24 unlet! varvalue
25 let varvalue = ListNth(a:exprs, i)
26 call env.set(varname, varvalue)
27 endif
28 let i = i + 1
29 endwhile
30 return env
31 endfunction
32
33 function Env.find(key) dict
34 if has_key(self.data, a:key)
35 return self
36 elseif empty(self.outer)
37 return ""
38 else
39 return self.outer.find(a:key)
40 endif
41 endfunction
42
43 function Env.set(key, value) dict
44 let self.data[a:key] = a:value
45 return a:value
46 endfunction
47
48 function Env.get(key) dict
49 let env = self.find(a:key)
50 if empty(env)
51 throw "'" . a:key . "' not found"
52 endif
53 return env.data[a:key]
54 endfunction
55
56 function Env.root() dict
57 let curr = self
58 while !empty(curr.outer)
59 let curr = curr.outer
60 endwhile
61 return curr
62 endfunction