func (v *evalVisitor) popCtx() reflect.Value {
	if len(v.ctx) == 0 {
		return zero
	}
	var result reflect.Value
	result, v.ctx = v.ctx[len(v.ctx)-1], v.ctx[:len(v.ctx)-1]
	return result
}
popCtx pops last context from stack
package raymond
import (
	"bytes"
	"fmt"
	"reflect"
	"strconv"
	"strings"
	"github.com/aymerick/raymond/ast"
)
var (
	errorType       = reflect.TypeOf((*error)(nil)).Elem()
	fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
	zero reflect.Value
)
type evalVisitor struct {
	tpl *Template
	ctx []reflect.Value
	dataFrame *DataFrame
	blockParams []map[string]interface{}
	blocks []*ast.BlockStatement
	exprs []*ast.Expression
	exprFunc map[*ast.Expression]bool
	curNode ast.Node
}
func newEvalVisitor(tpl *Template, ctx interface{}, privData *DataFrame) *evalVisitor {
	frame := privData
	if frame == nil {
		frame = NewDataFrame()
	}
	return &evalVisitor{
		tpl:       tpl,
		ctx:       []reflect.Value{reflect.ValueOf(ctx)},
		dataFrame: frame,
		exprFunc:  make(map[*ast.Expression]bool),
	}
}
func (v *evalVisitor) at(node ast.Node) {
	v.curNode = node
}
func (v *evalVisitor) pushCtx(ctx reflect.Value) {
	v.ctx = append(v.ctx, ctx)
}