func Call(stk Stack, fn interface{}, arity int) error {
	tfn := reflect.TypeOf(fn)
	n := tfn.NumIn()
	isVariadic := tfn.IsVariadic()  
	if isVariadic {
		if arity < n-1 {
			return ErrArgumentsNotEnough
		}
	} else if arity != n {
		return fmt.Errorf("invalid argument count: require %d, but we got %d", n, arity)
	}
	return DoCall(stk, fn, arity, n, isVariadic)
}
Call calls a fn.
package interpreter
import (
	"errors"
	"fmt"
	"go/token"
	"reflect"
)
var (
	ErrStackDamaged = errors.New("unexpected: stack damaged")
	ErrArgumentsNotEnough = errors.New("argument not enough")
)
var (
	typeFloat64 = reflect.TypeOf(float64(0))
)
type FileLine struct {
	File string
	Line int
}
type Stack interface {
	PopArgs(arity int) (args []reflect.Value, ok bool)
	PushRet(ret []reflect.Value) error
}
type Interface interface {
	Grammar() string
	Fntable() map[string]interface{}
	Stack() Stack
}
type Engine interface {
	EvalCode(ip Interface, name string, src interface{}) error
	FileLine(src interface{}) FileLine
	Source(src interface{}) []byte
}
type Context struct {
	Src    interface{}  
	Pos    token.Pos
	End    token.Pos
	Engine Engine
}