aboutsummaryrefslogtreecommitdiff
path: root/object/environment.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/environment.go')
-rw-r--r--object/environment.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/object/environment.go b/object/environment.go
new file mode 100644
index 0000000..6f31070
--- /dev/null
+++ b/object/environment.go
@@ -0,0 +1,30 @@
+package object
+
+func NewEnclosedEnvironment(outer *Environment) *Environment {
+ env := NewEnvironment()
+ env.outer = outer
+ return env
+}
+
+func NewEnvironment() *Environment {
+ s := make(map[string]Object)
+ return &Environment{store: s, outer: nil}
+}
+
+type Environment struct {
+ store map[string]Object
+ outer *Environment
+}
+
+func (e *Environment) Get(name string) (Object, bool) {
+ obj, ok := e.store[name]
+ if !ok && e.outer != nil {
+ obj, ok = e.outer.Get(name)
+ }
+ return obj, ok
+}
+
+func (e *Environment) Set(name string, val Object) Object {
+ e.store[name] = val
+ return val
+}