func (e *Evaluator) funcCall(v *ast.FuncCallExpr) bool { f, ok := builtin.Funcs[v.FnName.L] if !ok { e.err = ErrInvalidOperation.Gen("unknown function %s", v.FnName.O) return false } if len(v.Args) < f.MinArgs || (f.MaxArgs != -1 && len(v.Args) > f.MaxArgs) { e.err = ErrInvalidOperation.Gen("number of function arguments must in [%d, %d].", f.MinArgs, f.MaxArgs) return false } a := make([]interface{}, len(v.Args)) for i, arg := range v.Args { a[i] = arg.GetValue() } argMap := make(map[interface{}]interface{}) argMap[builtin.ExprEvalArgCtx] = e.ctx val, err := f.F(a, argMap) if err != nil { e.err = errors.Trace(err) return false } v.SetValue(val) return true }