Ian,
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ On Monday, June 1, 2020 5:54 AM, Ian Lance Taylor <i...@golang.org> wrote: > On Sat, May 30, 2020 at 2:32 AM Sebastien Binet d...@sbinet.org wrote: > > > the thing I am trying to solve is, basically, a generic way to: > > > > - pass a function with any number of parameters and a single return value > > - "bind" that function to a slice of pointers to values (that will point > > to, e.g., values extracted from a db) > > - create a closure that returns the value from evaluating the function > > with the bound paramaters. > > As you've discovered, the current generics design draft does not > support a variadic list of type parameters. > > That's something that might perhaps be added later, if we can figure > out how to do it. There is some discussion of it starting at > https://github.com/golang/go/issues/15292#issuecomment-598775120 . thanks. Egon came up with some nice improvements upon my first stab at this. His versions could probably handle the "multiple outputs" possible issue I was mentioning in passing. - version 1 === package main type Eval(type T) interface { Eval() T } type Binder interface { Value(name string) interface{} } type Formula(type Result) interface { Bind(source Binder) error Eval(Result) } type Func2 (type A, B, R) struct { Call func(A, B) R A Eval(A) B Eval(B) } func (fn Func2(A, B, R)) Eval() R { return fn.Call(fn.A.Eval(), fn.B.Eval()) } func Fn2(type A, B, R)(a, b string, db Binder, eval func(A, B) R) func() R { fn := Func2(A, B, R){ Call: eval, A: db.Value(a).(Eval(A)), B: db.Value(b).(Eval(B)), } return fn.Eval } type Values map[string]interface{} func (v Values) Value(name string) interface{} { return v[name]} type ConstFloat64 float64 func (v ConstFloat64) Eval() float64 { return float64(v) } type ConstFloat32 float32 func (v ConstFloat32) Eval() float32 { return float32(v) } func main() { rows := Values{ "alpha": ConstFloat64(123.123), "beta": ConstFloat32(53.123), } fn := Fn2(float64, float32, int64)( "alpha", "beta", rows, func(a float64, b float32) int64 { return int64(a) + int64(b) }, ) println("fn=", fn()) } === - version 2: === package main type Eval(type T) interface { Eval() T } type Binder interface { Value(name string) interface{} } type Formula(type Result) interface { Bind(source Binder) error Eval(Result) } type Func2 (type A, B, R) struct { A, B string Call func(A, B) R } func (fn Func2(A, B, R)) Bind(db Binder) Eval(R) { a := db.Value(fn.A).(Eval(A)) b := db.Value(fn.B).(Eval(B)) return evalFunc(R)(func() R { return fn.Call(a.Eval(), b.Eval()) }) } type evalFunc (type R) func() R func (fn evalFunc(R)) Eval() R { return fn() } type Values map[string]interface{} func (v Values) Value(name string) interface{} { return v[name]} type ConstFloat64 float64 func (v ConstFloat64) Eval() float64 { return float64(v) } type ConstFloat32 float32 func (v ConstFloat32) Eval() float32 { return float32(v) } func main() { rows := Values{ "alpha": ConstFloat64(123.123), "beta": ConstFloat32(53.123), } form := Func2(float64, float32, int64){ A: "alpha", B: "beta", Call: func(a float64, b float32) int64 { return int64(a) + int64(b) }, } fn := form.Bind(rows).Eval println("fn=", fn()) } === -s PS: here are the direct links: - https://ccbrown.github.io/wasm-go-playground/experimental/generics/#A4Qwxg1iDmCmAEBbEBLAdgKAwFwJ7AQFEA3EAGwAo8D4AVASnnW1gCcAzcBAbwwEgS5Co1oYAvlmoIAQugAmbJmhYcu8XnwBq5AK6wKaEIgQBnbK3TRGzNpzCxuEiTnwIAYgHtWiHWRBVXeAAlWBNfbGtlWzVeeDj4WTQ5ChMPHVZ7BPk2RjZWLwx4+EFKELCyCPFJQLcdNDAAJngAmgBBABoEzqDGM1YdMGx1fgBhcjJ4djqwCg6ExiD+VuLSSlb6fmkVoWkN5yn65vY0eFr6htnO6W76RhLhYOG+VlhsdJPjgDoxskov1s+93onS+0kBq2EeywBzApzQFyk8Dm12C9AoIE6ACN4H1LJ05NjEgpWJ1YKtJtNLvNURT6g8gk9jvAAFwAXlO0wuyJuGj4PzIzPgZPI7X4fFagoJn20ZD06Ponwo93WwLF0klmOlun0mIVSohu1VfAkz1e70maHB5CqLhoMr0JiQIGAAG1cWhoABdGyqeyOaHTZrEeD20KMUMGIymcyWSIqOwOMTqeAvN6sE7EF2GYye5yIkYeNBmNxkDwgbAANgALJNS+XqxgYUH4AWi9gS2XK1W7hDGOw613k6nzf3O9WKMRGBJ84XiwOAMxNUflxeNwMTluz9sLho9oR9ndDs3p2udxcTqcBw7IdAPDT5ADujrZIe1Jl5ACJyMAABYgD+Cq2c5jlWFAAIwNPOnwQfORp8B+mKvP+gFbh2K4XAArFBMFGs4fBMi+bjwhQy5diCO6dMw1ZomKX5kL+/6dAhSEfp0j4mKKfD4ZSICnvWVZYnx2CLnG1ZPFxw4nlRoEgIwADUShdhQupimInEbPwwAWMoZBoBQH7HKyrEWpCVRAA=== - https://ccbrown.github.io/wasm-go-playground/experimental/generics/#A4Qwxg1iDmCmAEBbEBLAdgKAwFwJ7AQFEA3EAGwAo8D4AVASnnW1gCcAzcBAbwwEgS5Co1oYAvlmoIAQugAmbJmhYcu8XnwBq5AK6wKaEIgQBnbK3TRGzNpzCxuEiTnwIAYgHtWiHWRBVXeAAlWBNfbGtlWzVeeDj4WTQ5ChMPHVZ7BPk2RjZWLwx4+EFKELCyCPFJQLcdNDAAJngAmgBBABoEzqDGM1YdMGx1fg6E+D7LfgBhcjJ4djqwClHpRiCqjAX65vY0eFr6huXO6W76RkTkuQAjLKSc4tJSxg0QeAAuAF54G4A6bTIegou1+rXovwoJWW534ty+P2u/10+hBqwhUNW9H4rFg2HSe1gTwOSx6wMWwmCwz4fBxeNYexBMzIlBAvyh9E6iPZWL4Yixzik8EJ5GJzUFPXm5LWm0WOwJRPJPUY7Mp3HgtPx8zQFIFgQBehMSBAwAA2hM0NAALo2VT2RxYLZgZrEeD60KMN0GIymcyWSIqOwOMTqdW4zXEE2GYyW3U0KYeNBmNxkDwgbAANgALPMU2mszLthQXfHE9hk6mM5nlU8Kexc5WQxr6TmK1mi4xYwgS0n6wBmJp1iv9gtOovwbtlvsNatCRiDtP9xth5vz7D99vwZyOo3oCkafIAd0N8LdJg0fAARORgAALEAX97jhM91uZigARgavd+n97HP4l7XLi96PhO5YLkcACs36/v+vJYHw7BeIgHzfMSRyrlmnSrv2nTMFm9Dnq0j5XmQt73u0AHSCRQHYBRAFMmQj6OhQbyYZmnIthB/pZlS1JNns+FviAjAANRKJWFDXDyvKUfB/C7Kh8zIb8lwUIeJjgiUCHABYyhkNqF67J8F7YdqMISEAA= -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/U_5cZ0Z5NlehLju7HVgayTcKCMhjUnvWvZd8ccMjiH1-_1kfz9lfx9XPaypIZCpNTJXQsD9M0jLLyj-2rzYpa3inRzMfYJ0MKi_HCnE7Sag%3D%40sbinet.org.