Merge pull request #49 from keith-rollin/swift
[jackhill/mal.git] / scala / env.scala
1 import types._list
2
3 import scala.collection.mutable
4
5 object env {
6 class Env(outer: Env = null,
7 binds: Iterator[Any] = null,
8 exprs: Iterator[Any] = null) {
9 val data: mutable.Map[Symbol, Any] = mutable.Map()
10 if (binds != null && exprs != null) {
11 binds.foreach(b => {
12 val k = b.asInstanceOf[Symbol]
13 if (k == '&) {
14 data(binds.next().asInstanceOf[Symbol]) = _list(exprs.toSeq:_*)
15 } else {
16 data(k) = exprs.next()
17 }
18 })
19 }
20
21 def find(key: Symbol): Env = {
22 if (data.contains(key)) {
23 this
24 } else if (outer != null) {
25 outer.find(key)
26 } else {
27 null
28 }
29 }
30 def set(key: Symbol, value: Any): Any = {
31 data(key) = value
32 value
33 }
34 def get(key: Symbol): Any = {
35 val env = find(key)
36 if (env == null) throw new Exception("'" + key.name + "' not found")
37 env.data(key)
38 }
39 }
40 }
41
42 // vim:ts=2:sw=2