aboutsummaryrefslogtreecommitdiff
path: root/scala/env.scala
blob: 33be545aecf0c7e349ced117fab7717389b8b19b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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