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.

Reply via email to