mirror of https://go.googlesource.com/go
42 lines
723 B
Go
42 lines
723 B
Go
// 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
|
|
}
|