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