lang: funcs: simple, simplepoly, operator: Misc fix ups for lambdas

These core functions need some small fixups to bring us up to our
lambdas branch.

Co-authored-by: Samuel Gélineau <gelisam@gmail.com>
This commit is contained in:
James Shubin
2023-09-25 17:23:41 -04:00
parent a1a23b66c8
commit d1f1ed8957
3 changed files with 24 additions and 7 deletions

View File

@@ -883,10 +883,27 @@ func (obj *OperatorFunc) Stream(ctx context.Context) error {
} }
obj.last = input // store for next obj.last = input // store for next
// programming error safety check...
programmingError := false
keys := []string{}
for k := range input.Struct() {
keys = append(keys, k)
if !util.StrInList(k, obj.Type.Ord) {
programmingError = true
}
}
if programmingError {
return fmt.Errorf("bad args, got: %v, want: %v", keys, obj.Type.Ord)
}
// build up arg list // build up arg list
args := []types.Value{} args := []types.Value{}
for _, name := range obj.Type.Ord { for _, name := range obj.Type.Ord {
v := input.Struct()[name] v, exists := input.Struct()[name]
if !exists {
// programming error
return fmt.Errorf("function engine was early, missing arg: %s", name)
}
if name == operatorArgName { if name == operatorArgName {
op = v.Str() op = v.Str()
continue // skip over the operator arg continue // skip over the operator arg
@@ -895,7 +912,8 @@ func (obj *OperatorFunc) Stream(ctx context.Context) error {
} }
if op == "" { if op == "" {
return fmt.Errorf("operator cannot be empty") // programming error
return fmt.Errorf("operator cannot be empty, args: %v", keys)
} }
// operator selection is dynamic now, although mostly it // operator selection is dynamic now, although mostly it
// should not change... to do so is probably uncommon... // should not change... to do so is probably uncommon...

View File

@@ -84,7 +84,7 @@ type WrappedFunc struct {
// String returns a simple name for this function. This is needed so this struct // String returns a simple name for this function. This is needed so this struct
// can satisfy the pgraph.Vertex interface. // can satisfy the pgraph.Vertex interface.
func (obj *WrappedFunc) String() string { func (obj *WrappedFunc) String() string {
return fmt.Sprintf("%s@%p", obj.Name, obj) // be more unique! return fmt.Sprintf("%s @ %p", obj.Name, obj) // be more unique!
} }
// ArgGen returns the Nth arg name for this function. // ArgGen returns the Nth arg name for this function.

View File

@@ -149,7 +149,7 @@ type WrappedFunc struct {
// String returns a simple name for this function. This is needed so this struct // String returns a simple name for this function. This is needed so this struct
// can satisfy the pgraph.Vertex interface. // can satisfy the pgraph.Vertex interface.
func (obj *WrappedFunc) String() string { func (obj *WrappedFunc) String() string {
return fmt.Sprintf("%s@%p", obj.Name, obj) // be more unique! return fmt.Sprintf("%s @ %p", obj.Name, obj) // be more unique!
} }
// ArgGen returns the Nth arg name for this function. // ArgGen returns the Nth arg name for this function.
@@ -501,9 +501,8 @@ func (obj *WrappedFunc) buildFunction(typ *types.Type, ix int) *types.Type {
panic("unexpected type") panic("unexpected type")
} }
obj.fn = fn obj.fn = fn
if obj.fn.T == nil { // XXX: should this even ever happen? What about argnames here? // FIXME: if obj.fn.T == nil {} // occasionally this is nil, is it a bug?
obj.fn.T = typ.Copy() // overwrites any contained "variant" type obj.fn.T = typ.Copy() // overwrites any contained "variant" type
}
return obj.fn.T return obj.fn.T
} }