Operator '@@' (export-all) added. Experimental include() function also added

This commit is contained in:
2024-04-06 03:06:07 +02:00
parent ce6b88ccdd
commit 7612a59757
10 changed files with 108 additions and 29 deletions
+19 -4
View File
@@ -36,15 +36,16 @@ func evalFuncCall(parentCtx exprContext, self *term) (v any, err error) {
}
if err == nil {
if v, err = ctx.Call(name, params); err == nil {
exportAll := isEnabled(ctx, control_export_all)
// Export variables
for _, refName := range ctx.EnumVars(func(name string) bool { return name[0] == '@' }) {
for _, refName := range ctx.EnumVars(func(name string) bool { return exportAll || name[0] == '@' }) {
refValue, _ := ctx.GetVar(refName)
parentCtx.SetVar(refName[1:], refValue)
exportVar(parentCtx, refName, refValue)
}
// Export functions
for _, refName := range ctx.EnumFuncs(func(name string) bool { return name[0] == '@' }) {
for _, refName := range ctx.EnumFuncs(func(name string) bool { return exportAll || name[0] == '@' }) {
if info := ctx.GetFuncInfo(refName); info != nil {
parentCtx.RegisterFunc(refName[1:], info.Functor(), info.MinArgs(), info.MaxArgs())
exportFunc(parentCtx, refName, info)
}
}
}
@@ -52,6 +53,20 @@ func evalFuncCall(parentCtx exprContext, self *term) (v any, err error) {
return
}
func exportVar(ctx exprContext, name string, value any) {
if name[0] == '@' {
name = name[1:]
}
ctx.SetVar(name, value)
}
func exportFunc(ctx exprContext, name string, info exprFunc) {
if name[0] == '@' {
name = name[1:]
}
ctx.RegisterFunc(name, info.Functor(), info.MinArgs(), info.MaxArgs())
}
// -------- function definition term
func newFuncDefTerm(tk *Token, args []*term) *term {
return &term{