From ba479a1b9905492350f3da7778a9ff62c8a9b27a Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Mon, 17 Jun 2024 06:54:50 +0200 Subject: [PATCH] Function call moved from operand-func.go to function.go --- bind-expr-functions.go | 24 +++++++++--------- context-helpers.go | 6 +++++ function.go | 39 +++++++++++++++++++++++++++++ operand-func.go | 37 ++------------------------- int.list => test-resources/int.list | 0 5 files changed, 59 insertions(+), 47 deletions(-) rename int.list => test-resources/int.list (100%) diff --git a/bind-expr-functions.go b/bind-expr-functions.go index cec1c7b..b621a46 100644 --- a/bind-expr-functions.go +++ b/bind-expr-functions.go @@ -43,16 +43,16 @@ func (functor *exprFunctor) Invoke(ctx ExprContext, name string, args []any) (re return } -func CallExprFunction(parentCtx ExprContext, funcName string, params ...any) (v any, err error) { - ctx := cloneContext(parentCtx) - ctx.SetParent(parentCtx) +// func CallExprFunction(parentCtx ExprContext, funcName string, params ...any) (v any, err error) { +// ctx := cloneContext(parentCtx) +// ctx.SetParent(parentCtx) - if err == nil { - if err = checkFunctionCall(ctx, funcName, ¶ms); err == nil { - if v, err = ctx.Call(funcName, params); err == nil { - exportObjects(parentCtx, ctx) - } - } - } - return -} +// if err == nil { +// if err = checkFunctionCall(ctx, funcName, ¶ms); err == nil { +// if v, err = ctx.Call(funcName, params); err == nil { +// exportObjects(parentCtx, ctx) +// } +// } +// } +// return +// } diff --git a/context-helpers.go b/context-helpers.go index 9f4d1ad..64315c6 100644 --- a/context-helpers.go +++ b/context-helpers.go @@ -41,3 +41,9 @@ func exportObjects(destCtx, sourceCtx ExprContext) { } } } + +func exportObjectsToParent(sourceCtx ExprContext) { + if parentCtx := sourceCtx.GetParent(); parentCtx != nil { + exportObjects(parentCtx, sourceCtx) + } +} diff --git a/function.go b/function.go index c5bb452..7c20ef6 100644 --- a/function.go +++ b/function.go @@ -199,3 +199,42 @@ func (info *funcInfo) MaxArgs() int { func (info *funcInfo) Functor() Functor { return info.functor } + +// ----- Call a function --- + +func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err error) { + if info, exists, owner := GetFuncInfo(ctx, name); exists { + passedCount := len(*varParams) + if info.MinArgs() > passedCount { + err = ErrTooFewParams(name, info.MinArgs(), info.MaxArgs(), passedCount) + } + for i, p := range info.Params() { + if i >= passedCount { + if !p.IsDefault() { + break + } + *varParams = append(*varParams, p.DefaultValue()) + } + } + if err == nil && info.MaxArgs() >= 0 && info.MaxArgs() < len(*varParams) { + err = ErrTooMuchParams(name, info.MaxArgs(), len(*varParams)) + } + if err == nil && owner != ctx { + ctx.RegisterFuncInfo(info) + } + } else { + err = fmt.Errorf("unknown function %s()", name) + } + return +} + +func CallFunction(parentCtx ExprContext, name string, params []any) (result any, err error) { + ctx := cloneContext(parentCtx) + ctx.SetParent(parentCtx) + + if err = checkFunctionCall(ctx, name, ¶ms); err == nil { + result, err = ctx.Call(name, params) + exportObjectsToParent(ctx) + } + return +} diff --git a/operand-func.go b/operand-func.go index da750a3..a044a0c 100644 --- a/operand-func.go +++ b/operand-func.go @@ -6,7 +6,6 @@ package expr import ( "errors" - "fmt" ) // -------- function call term @@ -22,35 +21,7 @@ func newFuncCallTerm(tk *Token, args []*term) *term { } // -------- eval func call -func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err error) { - if info, exists, owner := GetFuncInfo(ctx, name); exists { - passedCount := len(*varParams) - if info.MinArgs() > passedCount { - err = ErrTooFewParams(name, info.MinArgs(), info.MaxArgs(), passedCount) - } - for i, p := range info.Params() { - if i >= passedCount { - if !p.IsDefault() { - break - } - *varParams = append(*varParams, p.DefaultValue()) - } - } - if err == nil && info.MaxArgs() >= 0 && info.MaxArgs() < len(*varParams) { - err = ErrTooMuchParams(name, info.MaxArgs(), len(*varParams)) - } - if err == nil && owner != ctx { - ctx.RegisterFuncInfo(info) - } - } else { - err = fmt.Errorf("unknown function %s()", name) - } - return -} - -func evalFuncCall(parentCtx ExprContext, self *term) (v any, err error) { - ctx := cloneContext(parentCtx) - ctx.SetParent(parentCtx) +func evalFuncCall(ctx ExprContext, self *term) (v any, err error) { name, _ := self.tk.Value.(string) params := make([]any, len(self.children), len(self.children)+5) for i, tree := range self.children { @@ -62,11 +33,7 @@ func evalFuncCall(parentCtx ExprContext, self *term) (v any, err error) { } if err == nil { - if err = checkFunctionCall(ctx, name, ¶ms); err == nil { - if v, err = ctx.Call(name, params); err == nil { - exportObjects(parentCtx, ctx) - } - } + v, err = CallFunction(ctx, name, params) } return } diff --git a/int.list b/test-resources/int.list similarity index 100% rename from int.list rename to test-resources/int.list