mirror of
https://github.com/golang/go
synced 2024-11-23 21:20:03 -07:00
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
|
||
|
}
|