Function buildActualParams moved from data-cursor.go ro function.go

This commit is contained in:
Celestino Amoroso 2024-07-31 09:08:58 +02:00
parent 9070b5c9cc
commit a46753f453
2 changed files with 32 additions and 19 deletions

View File

@ -85,7 +85,7 @@ func (dc *dataCursor) HasOperation(name string) (exists bool) {
return return
} }
func (dc *dataCursor) CallOperation(name string, args []any) (value any, err error) { func (dc *dataCursor) CallOperation(name string, args map[string]any) (value any, err error) {
if name == IndexName { if name == IndexName {
value = int64(dc.Index()) value = int64(dc.Index())
} else if functor, ok := dc.ds[name]; ok && isFunctor(functor) { } else if functor, ok := dc.ds[name]; ok && isFunctor(functor) {
@ -95,7 +95,7 @@ func (dc *dataCursor) CallOperation(name string, args []any) (value any, err err
value, err = dc.Reset() value, err = dc.Reset()
} else { } else {
ctx := cloneContext(dc.ctx) ctx := cloneContext(dc.ctx)
value, err = functor.InvokeNamed(ctx, name, map[string]any{}) value, err = functor.InvokeNamed(ctx, name, args)
exportObjects(dc.ctx, ctx) exportObjects(dc.ctx, ctx)
} }
} else { } else {
@ -239,16 +239,3 @@ func (dc *dataCursor) Count() int {
return dc.count return dc.count
} }
func buildActualParams(functor Functor, args []any) (actualParams map[string]any) {
formalParams := functor.GetParams()
actualParams = make(map[string]any, len(formalParams))
for i, spec := range formalParams {
if i < len(formalParams) {
actualParams[spec.Name()] = args[i]
} else {
actualParams[spec.Name()] = nil
}
}
return
}

View File

@ -6,6 +6,7 @@ package expr
import ( import (
"fmt" "fmt"
"strconv"
"strings" "strings"
) )
@ -223,13 +224,17 @@ func (info *funcInfo) checkExistingParam(paramName string) (exists bool) {
return return
} }
func (info *funcInfo) initActualParams(ctx ExprContext, name string, callTerm *term) (params map[string]any, err error) { func (info *funcInfo) initActualParams(ctx ExprContext, name string, callTerm *term) (actualParams map[string]any, err error) {
var varArgs []any var varArgs []any
var varName string var varName string
namedParamsStarted := false namedParamsStarted := false
actualParams := make(map[string]any, len(info.formalParams)) actualParams = make(map[string]any, len(info.formalParams))
if callTerm == nil {
return
}
for i, tree := range callTerm.children { for i, tree := range callTerm.children {
var paramValue any var paramValue any
paramCtx := ctx.Clone() paramCtx := ctx.Clone()
@ -268,7 +273,6 @@ func (info *funcInfo) initActualParams(ctx ExprContext, name string, callTerm *t
if varArgs != nil { if varArgs != nil {
actualParams[varName] = varArgs actualParams[varName] = varArgs
} }
params = actualParams
} }
return return
} }
@ -319,7 +323,7 @@ func getAssignVarName(t *term) (name string, ok bool) {
return return
} }
func CallFunction3(parentCtx ExprContext, name string, callTerm *term) (result any, err error) { func CallFunction(parentCtx ExprContext, name string, callTerm *term) (result any, err error) {
var actualParams map[string]any var actualParams map[string]any
if info, exists := GetFuncInfo(parentCtx, name); exists { if info, exists := GetFuncInfo(parentCtx, name); exists {
var ctx ExprContext var ctx ExprContext
@ -333,3 +337,25 @@ func CallFunction3(parentCtx ExprContext, name string, callTerm *term) (result a
} }
return return
} }
func GetParam(args map[string]any, paramName string, paramNum int) (value any, exists bool) {
if value, exists = args[paramName]; !exists {
if paramNum > 0 && paramNum <= len(args) {
value, exists = args["arg"+strconv.Itoa(paramNum)]
}
}
return
}
func buildActualParams(functor Functor, args []any) (actualParams map[string]any) {
formalParams := functor.GetParams()
actualParams = make(map[string]any, len(args))
for i, arg := range args {
if i < len(formalParams) {
actualParams[formalParams[i].Name()] = arg
} else {
actualParams["arg"+strconv.Itoa(i+1)] = arg
}
}
return
}