rationalized context convertion to dict and string types

This commit is contained in:
2026-05-21 03:52:48 +02:00
parent a62f27b104
commit e1c24daac4
5 changed files with 92 additions and 72 deletions
+10 -6
View File
@@ -76,9 +76,11 @@ func (dict *DictType) toMultiLine(sb *strings.Builder, opt FmtOpt) {
sb.WriteString(nest)
if key, ok := name.(string); ok {
sb.WriteString(string('"') + key + string('"'))
sb.WriteByte('"')
sb.WriteString(key)
sb.WriteByte('"')
} else {
sb.WriteString(fmt.Sprintf("%v", name))
fmt.Fprintf(sb, "%v", name)
}
sb.WriteString(": ")
if f, ok := value.(Formatter); ok {
@@ -86,7 +88,7 @@ func (dict *DictType) toMultiLine(sb *strings.Builder, opt FmtOpt) {
} else if _, ok = value.(Functor); ok {
sb.WriteString("func(){}")
} else {
sb.WriteString(fmt.Sprintf("%v", value))
fmt.Fprintf(sb, "%v", value)
}
}
sb.WriteByte('\n')
@@ -110,9 +112,11 @@ func (dict *DictType) ToString(opt FmtOpt) string {
sb.WriteString(", ")
}
if s, ok := key.(string); ok {
sb.WriteString(string('"') + s + string('"'))
sb.WriteByte('"')
sb.WriteString(s)
sb.WriteByte('"')
} else {
sb.WriteString(fmt.Sprintf("%v", key))
fmt.Fprintf(&sb, "%v", key)
}
sb.WriteString(": ")
if formatter, ok := value.(Formatter); ok {
@@ -120,7 +124,7 @@ func (dict *DictType) ToString(opt FmtOpt) string {
} else if t, ok := value.(Term); ok {
sb.WriteString(t.String())
} else {
sb.WriteString(fmt.Sprintf("%#v", value))
fmt.Fprintf(&sb, "%#v", value)
}
}
sb.WriteByte('}')
+32
View File
@@ -28,4 +28,36 @@ type ExprContext interface {
Call(name string, args map[string]any) (result any, err error)
RegisterFuncInfo(info ExprFunc)
RegisterFunc(name string, f Functor, returnType string, param []ExprFuncParam) (funcInfo ExprFunc, err error)
ToDict() (dict *DictType)
ToString(opt FmtOpt) string
}
func ContextToDict(ctx ExprContext) (dict *DictType) {
var keys []string
// Variables
keys = ctx.EnumVars(nil)
vars := MakeDict()
for _, key := range keys {
value, _ := ctx.GetVar(key)
vars.SetItem(key, value)
}
// Functions
keys = ctx.EnumFuncs(func(name string) bool { return true })
funcs := MakeDict()
for _, key := range keys {
funcInfo, _ := ctx.GetFuncInfo(key)
funcs.SetItem(key, funcInfo)
}
dict = MakeDict()
dict.SetItem("vars", vars)
dict.SetItem("funcs", funcs)
return
}
func ContextToString(ctx ExprContext, opt FmtOpt) string {
dict := ctx.ToDict()
return dict.ToString(opt)
}