diff options
Diffstat (limited to 'nim/env.nim')
| -rw-r--r-- | nim/env.nim | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/nim/env.nim b/nim/env.nim new file mode 100644 index 0000000..7432d09 --- /dev/null +++ b/nim/env.nim @@ -0,0 +1,25 @@ +import tables, types + +proc initEnv*(outer: Env = nil, binds, exprs: MalType = nilObj): Env = + result = Env(data: initTable[string, MalType](), outer: outer) + + if binds.kind in {List, Vector}: + for i, e in binds.list: + if e.str == "&": + result.data[binds.list[i+1].str] = list(exprs.list[i .. -1]) + break + else: + result.data[e.str] = exprs.list[i] + +proc set*(e: var Env, key: string, value: MalType): MalType {.discardable.} = + e.data[key] = value + value + +proc find*(e: Env, key: string): Env = + if e.data.hasKey(key): return e + if e.outer != nil: return e.outer.find(key) + +proc get*(e: Env, key: string): MalType = + let env = e.find(key) + if env == nil: raise newException(ValueError, "'" & key & "' not found") + env.data[key] |
