aboutsummaryrefslogtreecommitdiff
path: root/nim/env.nim
diff options
context:
space:
mode:
Diffstat (limited to 'nim/env.nim')
-rw-r--r--nim/env.nim25
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]