package object import "unicode" 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 } // ExportedHash returns a new Hash with the names and values of every publicly // exported binding in the environment. That is every binding that starts with a // capital letter. This is used by the module import system to wrap up the // evaluated module into an object. func (e *Environment) ExportedHash() *Hash { pairs := make(map[HashKey]HashPair) for k, v := range e.store { if unicode.IsUpper(rune(k[0])) { s := String{Value: k} pairs[s.HashKey()] = HashPair{Key: s, Value: v} } } return &Hash{Pairs: pairs} }