12 function NewEnvWithBinds(outer, binds, exprs)
13 let env = NewEnv(a:outer)
15 while i < ListCount(a:binds)
16 let varname = ListNth(a:binds, i).val
19 let restvarname = ListNth(a:binds, i + 1).val
20 let restvarvalues = ListDrop(a:exprs, i)
21 call env.set(restvarname, restvarvalues)
25 let varvalue = ListNth(a:exprs, i)
26 call env.set(varname, varvalue)
33 function Env.find(key) dict
34 if has_key(self.data, a:key)
36 elseif empty(self.outer)
39 return self.outer.find(a:key)
43 function Env.set(key, value) dict
44 let self.data[a:key] = a:value
48 function Env.get(key) dict
49 let env = self.find(a:key)
51 throw "'" . a:key . "' not found"
53 return env.data[a:key]
56 function Env.root() dict
58 while !empty(curr.outer)