From 115ce26ce9fb1beda1c3d46007e8490430e68d60 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Fri, 7 Jun 2024 09:45:02 +0200 Subject: [PATCH] IsOptional() function of ExprFuncParam renamed as IdDefault(). A new IsOptional() function created to check if a param is optional without requiring a default value --- context.go | 3 +++ func-base.go | 2 +- func-import.go | 9 +++++---- func-math.go | 4 ++-- func-os.go | 4 ++-- func-string.go | 8 ++++---- function.go | 15 ++++++++++----- operand-func.go | 5 +++-- operator-coalesce.go | 2 +- operator-ctrl.go | 2 +- operator-selector.go | 6 +++--- simple-store.go | 9 +++++++++ 12 files changed, 44 insertions(+), 25 deletions(-) diff --git a/context.go b/context.go index a77f9c7..f263a3c 100644 --- a/context.go +++ b/context.go @@ -16,6 +16,7 @@ type Functor interface { type ExprFuncParam interface { Name() string Type() string + IsDefault() bool IsOptional() bool IsRepeat() bool DefaultValue() any @@ -36,6 +37,8 @@ type ExprFunc interface { type ExprContext interface { Clone() ExprContext Merge(ctx ExprContext) + SetParent(ctx ExprContext) + GetParent() (ctx ExprContext) GetVar(varName string) (value any, exists bool) SetVar(varName string, value any) UnsafeSetVar(varName string, value any) diff --git a/func-base.go b/func-base.go index c735ebd..6bb067e 100644 --- a/func-base.go +++ b/func-base.go @@ -177,7 +177,7 @@ func ImportBuiltinsFuncs(ctx ExprContext) { ctx.RegisterFunc("dec", NewGolangFunctor(decFunc), TypeFloat, anyParams) ctx.RegisterFunc("fract", NewGolangFunctor(fractFunc), TypeFraction, []ExprFuncParam{ NewFuncParam(paramValue), - NewFuncParamFlagDef("denominator", PfOptional, 1), + NewFuncParamFlagDef("denominator", PfDefault, 1), }) } diff --git a/func-import.go b/func-import.go index 2ece721..80b683d 100644 --- a/func-import.go +++ b/func-import.go @@ -16,7 +16,7 @@ func importFunc(ctx ExprContext, name string, args []any) (result any, err error } func importAllFunc(ctx ExprContext, name string, args []any) (result any, err error) { - enable(ctx, control_export_all) + CtrlEnable(ctx, control_export_all) return importGeneral(ctx, name, args) } @@ -30,7 +30,8 @@ func importGeneral(ctx ExprContext, name string, args []any) (result any, err er } func addPresetImportDirs(ctx ExprContext, dirList []string) []string { - return addPresetDirs(ctx, ControlImportPath, dirList) + // return addPresetDirs(ctx, ControlImportPath, dirList) + return addSearchDirs(ctx, "sources", dirList) } func doImport(ctx ExprContext, name string, dirList []string, it Iterator) (result any, err error) { @@ -49,9 +50,9 @@ func doImport(ctx ExprContext, name string, dirList []string, it Iterator) (resu defer file.Close() var expr *ast scanner := NewScanner(file, DefaultTranslations()) - parser := NewParser(ctx) + parser := NewParser() if expr, err = parser.parseGeneral(scanner, true, true); err == nil { - result, err = expr.eval(ctx, false) + result, err = expr.Eval(ctx) } if err != nil { break diff --git a/func-math.go b/func-math.go index 5b37d8e..aa06c93 100644 --- a/func-math.go +++ b/func-math.go @@ -168,11 +168,11 @@ func mulFunc(ctx ExprContext, name string, args []any) (result any, err error) { func ImportMathFuncs(ctx ExprContext) { ctx.RegisterFunc("add", &golangFunctor{f: addFunc}, TypeNumber, []ExprFuncParam{ - NewFuncParamFlagDef(paramValue, PfOptional|PfRepeat, int64(0)), + NewFuncParamFlagDef(paramValue, PfDefault|PfRepeat, int64(0)), }) ctx.RegisterFunc("mul", &golangFunctor{f: mulFunc}, TypeNumber, []ExprFuncParam{ - NewFuncParamFlagDef(paramValue, PfOptional|PfRepeat, int64(1)), + NewFuncParamFlagDef(paramValue, PfDefault|PfRepeat, int64(1)), }) } diff --git a/func-os.go b/func-os.go index 53c905f..d0b1616 100644 --- a/func-os.go +++ b/func-os.go @@ -198,11 +198,11 @@ func ImportOsFuncs(ctx ExprContext) { }) ctx.RegisterFunc("writeFile", NewGolangFunctor(writeFileFunc), TypeInt, []ExprFuncParam{ NewFuncParam(TypeHandle), - NewFuncParamFlagDef(TypeItem, PfOptional|PfRepeat, ""), + NewFuncParamFlagDef(TypeItem, PfDefault|PfRepeat, ""), }) ctx.RegisterFunc("readFile", NewGolangFunctor(readFileFunc), TypeString, []ExprFuncParam{ NewFuncParam(TypeHandle), - NewFuncParamFlagDef("limitCh", PfOptional, "\n"), + NewFuncParamFlagDef("limitCh", PfDefault, "\n"), }) ctx.RegisterFunc("closeFile", NewGolangFunctor(closeFileFunc), TypeBoolean, []ExprFuncParam{ NewFuncParam(TypeHandle), diff --git a/func-string.go b/func-string.go index e52df49..90719f7 100644 --- a/func-string.go +++ b/func-string.go @@ -189,14 +189,14 @@ func ImportStringFuncs(ctx ExprContext) { ctx.RegisterFunc("subStr", NewGolangFunctor(subStrFunc), TypeString, []ExprFuncParam{ NewFuncParam(paramSource), - NewFuncParamFlagDef(paramStart, PfOptional, int64(0)), - NewFuncParamFlagDef(paramCount, PfOptional, int64(-1)), + NewFuncParamFlagDef(paramStart, PfDefault, int64(0)), + NewFuncParamFlagDef(paramCount, PfDefault, int64(-1)), }) ctx.RegisterFunc("splitStr", NewGolangFunctor(splitStrFunc), "list of "+TypeString, []ExprFuncParam{ NewFuncParam(paramSource), - NewFuncParamFlagDef(paramSeparator, PfOptional, ""), - NewFuncParamFlagDef(paramCount, PfOptional, int64(-1)), + NewFuncParamFlagDef(paramSeparator, PfDefault, ""), + NewFuncParamFlagDef(paramCount, PfDefault, int64(-1)), }) ctx.RegisterFunc("trimStr", NewGolangFunctor(trimStrFunc), TypeString, []ExprFuncParam{ diff --git a/function.go b/function.go index 0a51425..e8d907e 100644 --- a/function.go +++ b/function.go @@ -91,7 +91,7 @@ func (functor *exprFunctor) Invoke(ctx ExprContext, name string, args []any) (re ctx.UnsafeSetVar(p.Name(), nil) } } - result, err = functor.expr.eval(ctx, false) + result, err = functor.expr.Eval(ctx) return } @@ -99,7 +99,8 @@ func (functor *exprFunctor) Invoke(ctx ExprContext, name string, args []any) (re type paramFlags uint16 const ( - PfOptional paramFlags = 1 << iota + PfDefault paramFlags = 1 << iota + PfOptional PfRepeat ) @@ -126,7 +127,11 @@ func (param *funcParamInfo) Name() string { } func (param *funcParamInfo) Type() string { - return "any" + return TypeAny +} + +func (param *funcParamInfo) IsDefault() bool { + return (param.flags & PfDefault) != 0 } func (param *funcParamInfo) IsOptional() bool { @@ -159,7 +164,7 @@ func newFuncInfo(name string, functor Functor, returnType string, params []ExprF if maxArgs == -1 { return nil, fmt.Errorf("no more params can be specified after the ellipsis symbol: %q", p.Name()) } - if p.IsOptional() { + if p.IsDefault() || p.IsOptional() { maxArgs++ } else if maxArgs == minArgs { minArgs++ @@ -207,7 +212,7 @@ func (info *funcInfo) ToString(opt FmtOpt) string { } sb.WriteString(p.Name()) - if p.IsOptional() { + if p.IsDefault() { sb.WriteByte('=') if s, ok := p.DefaultValue().(string); ok { sb.WriteByte('"') diff --git a/operand-func.go b/operand-func.go index 1d16ac0..87fb8c7 100644 --- a/operand-func.go +++ b/operand-func.go @@ -30,7 +30,7 @@ func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err erro } for i, p := range info.Params() { if i >= passedCount { - if !p.IsOptional() { + if !p.IsDefault() { break } *varParams = append(*varParams, p.DefaultValue()) @@ -50,6 +50,7 @@ func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err erro func evalFuncCall(parentCtx ExprContext, self *term) (v any, err error) { ctx := cloneContext(parentCtx) + ctx.SetParent(parentCtx) name, _ := self.tk.Value.(string) params := make([]any, len(self.children), len(self.children)+5) for i, tree := range self.children { @@ -91,7 +92,7 @@ func evalFuncDef(ctx ExprContext, self *term) (v any, err error) { var defValue any flags := paramFlags(0) if len(param.children) > 0 { - flags |= PfOptional + flags |= PfDefault if defValue, err = param.children[0].compute(ctx); err != nil { return } diff --git a/operator-coalesce.go b/operator-coalesce.go index de323c6..3f32ea1 100644 --- a/operator-coalesce.go +++ b/operator-coalesce.go @@ -68,7 +68,7 @@ func evalAssignCoalesce(ctx ExprContext, self *term) (v any, err error) { if functor, ok := rightValue.(Functor); ok { //ctx.RegisterFunc(leftTerm.source(), functor, 0, -1) ctx.RegisterFunc(leftTerm.source(), functor, TypeAny, []ExprFuncParam{ - NewFuncParamFlag(paramValue, PfOptional|PfRepeat), + NewFuncParamFlag(paramValue, PfDefault|PfRepeat), }) } else { v = rightValue diff --git a/operator-ctrl.go b/operator-ctrl.go index 7efc2f0..a32c41e 100644 --- a/operator-ctrl.go +++ b/operator-ctrl.go @@ -17,7 +17,7 @@ func newExportAllTerm(tk *Token) (inst *term) { } func evalExportAll(ctx ExprContext, self *term) (v any, err error) { - enable(ctx, control_export_all) + CtrlEnable(ctx, control_export_all) return } diff --git a/operator-selector.go b/operator-selector.go index 33608a8..684d335 100644 --- a/operator-selector.go +++ b/operator-selector.go @@ -19,17 +19,17 @@ func newSelectorTerm(tk *Token) (inst *term) { func trySelectorCase(ctx ExprContext, exprValue, caseSel any, caseIndex int) (match bool, selectedValue any, err error) { caseData, _ := caseSel.(*selectorCase) if caseData.filterList == nil { - selectedValue, err = caseData.caseExpr.eval(ctx, false) + selectedValue, err = caseData.caseExpr.Eval(ctx) match = true } else if filterList, ok := caseData.filterList.value().([]*term); ok { if len(filterList) == 0 && exprValue == int64(caseIndex) { - selectedValue, err = caseData.caseExpr.eval(ctx, false) + selectedValue, err = caseData.caseExpr.Eval(ctx) match = true } else { var caseValue any for _, caseTerm := range filterList { if caseValue, err = caseTerm.compute(ctx); err != nil || caseValue == exprValue { - selectedValue, err = caseData.caseExpr.eval(ctx, false) + selectedValue, err = caseData.caseExpr.Eval(ctx) match = true break } diff --git a/simple-store.go b/simple-store.go index 3cdef8b..9b8ef52 100644 --- a/simple-store.go +++ b/simple-store.go @@ -11,6 +11,7 @@ import ( ) type SimpleStore struct { + parent ExprContext varStore map[string]any funcStore map[string]ExprFunc } @@ -26,6 +27,14 @@ func NewSimpleStore() *SimpleStore { func filterRefName(name string) bool { return name[0] != '@' } func filterPrivName(name string) bool { return name[0] != '_' } +func (ctx *SimpleStore) SetParent(parentCtx ExprContext) { + ctx.parent = parentCtx +} + +func (ctx *SimpleStore) GetParent() ExprContext { + return ctx.parent +} + func (ctx *SimpleStore) Clone() ExprContext { return &SimpleStore{ varStore: CloneFilteredMap(ctx.varStore, filterRefName),