| // compile |
| |
| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package p |
| |
| type Symbol interface{} |
| |
| type Value interface { |
| String() string |
| } |
| |
| type Object interface { |
| String() string |
| } |
| |
| type Scope struct { |
| outer *Scope |
| elems map[string]Object |
| } |
| |
| func (s *Scope) findouter(name string) (*Scope, Object) { |
| return s.outer.findouter(name) |
| } |
| |
| func (s *Scope) Resolve(name string) (sym Symbol) { |
| if _, obj := s.findouter(name); obj != nil { |
| sym = obj.(Symbol) |
| } |
| return |
| } |
| |
| type ScopeName struct { |
| scope *Scope |
| } |
| |
| func (n *ScopeName) Get(name string) (Value, error) { |
| return n.scope.Resolve(name).(Value), nil |
| } |