|  | // 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 | 
|  | } |