runtest: set INPUTRC to /dev/null
[jackhill/mal.git] / nim / env.nim
1 import tables, types
2
3 proc initEnv*(outer: Env = nil, binds, exprs: MalType = nilObj): Env =
4 result = Env(data: initTable[string, MalType](), outer: outer)
5
6 if binds.kind in {List, Vector}:
7 for i, e in binds.list:
8 if e.str == "&":
9 result.data[binds.list[i+1].str] = list(exprs.list[i .. -1])
10 break
11 else:
12 result.data[e.str] = exprs.list[i]
13
14 proc set*(e: var Env, key: string, value: MalType): MalType {.discardable.} =
15 e.data[key] = value
16 value
17
18 proc find*(e: Env, key: string): Env =
19 if e.data.hasKey(key): return e
20 if e.outer != nil: return e.outer.find(key)
21
22 proc get*(e: Env, key: string): MalType =
23 let env = e.find(key)
24 if env == nil: raise newException(ValueError, "'" & key & "' not found")
25 env.data[key]