func (s *scope) push(indirect bool) *scope {
	sc := scope{anc: s, level: s.level, sym: map[string]*symbol{}}
	if indirect {
		sc.types = []reflect.Type{}
		sc.level = s.level + 1
	} else {
		sc.types = s.types
		sc.def = s.def
		sc.global = s.global
		sc.level = s.level
	}
	return &sc
}
push creates a new scope and chain it to the current one
package interp
import (
	"log"
	"reflect"
	"strconv"
)
type sKind uint
const (
	undefSym sKind = iota
	binSym          
	bltnSym         
	constSym        
	funcSym         
	labelSym        
	pkgSym          
	typeSym         
	varSym          
)
var symKinds = [...]string{
	undefSym: "undefSym",
	binSym:   "binSym",
	bltnSym:  "bltnSym",
	constSym: "constSym",
	funcSym:  "funcSym",
	labelSym: "labelSym",
	pkgSym:   "pkgSym",
	typeSym:  "typeSym",
	varSym:   "varSym",
}
func (k sKind) String() string {
	if k < sKind(len(symKinds)) {
		return symKinds[k]
	}
	return "SymKind(" + strconv.Itoa(int(k)) + ")"
}
type symbol struct {
	kind    sKind
	typ     *itype         
	node    *node          
	from    []*node        
	recv    *receiver      
	index   int            
	rval    reflect.Value  
	builtin bltnGenerator  
	global  bool           
}
type scope struct {
	anc    *scope              
	def    *node               
	types  []reflect.Type      
	level  int                 
	sym    map[string]*symbol  
	global bool                
}