59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// function.go
|
|
package expr
|
|
|
|
// ---- Linking with Expr functions
|
|
type exprFunctor struct {
|
|
baseFunctor
|
|
params []ExprFuncParam
|
|
expr Expr
|
|
defCtx ExprContext
|
|
}
|
|
|
|
// func newExprFunctor(e Expr, params []string, ctx ExprContext) *exprFunctor {
|
|
// return &exprFunctor{expr: e, params: params, defCtx: ctx}
|
|
// }
|
|
|
|
func newExprFunctor(e Expr, params []ExprFuncParam, ctx ExprContext) *exprFunctor {
|
|
return &exprFunctor{expr: e, params: params, defCtx: ctx}
|
|
}
|
|
|
|
func (functor *exprFunctor) Invoke(ctx ExprContext, name string, args []any) (result any, err error) {
|
|
if functor.defCtx != nil {
|
|
ctx.Merge(functor.defCtx)
|
|
}
|
|
|
|
for i, p := range functor.params {
|
|
if i < len(args) {
|
|
arg := args[i]
|
|
if funcArg, ok := arg.(Functor); ok {
|
|
// ctx.RegisterFunc(p, functor, 0, -1)
|
|
paramSpecs := funcArg.GetParams()
|
|
ctx.RegisterFunc(p.Name(), funcArg, TypeAny, paramSpecs)
|
|
} else {
|
|
ctx.UnsafeSetVar(p.Name(), arg)
|
|
}
|
|
} else {
|
|
ctx.UnsafeSetVar(p.Name(), nil)
|
|
}
|
|
}
|
|
result, err = functor.expr.Eval(ctx)
|
|
return
|
|
}
|
|
|
|
// 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
|
|
// }
|