diff options
Diffstat (limited to 'scala/env.scala')
| -rw-r--r-- | scala/env.scala | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/scala/env.scala b/scala/env.scala new file mode 100644 index 0000000..33be545 --- /dev/null +++ b/scala/env.scala @@ -0,0 +1,42 @@ +import types._list + +import scala.collection.mutable + +object env { + class Env(outer: Env = null, + binds: Iterator[Any] = null, + exprs: Iterator[Any] = null) { + val data: mutable.Map[Symbol, Any] = mutable.Map() + if (binds != null && exprs != null) { + binds.foreach(b => { + val k = b.asInstanceOf[Symbol] + if (k == '&) { + data(binds.next().asInstanceOf[Symbol]) = _list(exprs.toSeq:_*) + } else { + data(k) = exprs.next() + } + }) + } + + def find(key: Symbol): Env = { + if (data.contains(key)) { + this + } else if (outer != null) { + outer.find(key) + } else { + null + } + } + def set(key: Symbol, value: Any): Any = { + data(key) = value + value + } + def get(key: Symbol): Any = { + val env = find(key) + if (env == null) throw new Exception("'" + key.name + "' not found") + env.data(key) + } + } +} + +// vim:ts=2:sw=2 |
