package main

import (
    "fmt"
    "reflect"
)

func curry( f interface{} ) func( interface{} ) func( interface{} ) interface{} {
    return func( a interface{} ) func( interface{} ) interface{} {
        return func( b interface{} ) interface{} {
            ff := reflect.ValueOf(f)
            va := reflect.ValueOf(a)
            vb := reflect.ValueOf(b)
            varg := [] reflect.Value { va, vb }
            return ff.Call( varg )[0].Interface()
        }
    }
}

func main() {
    csum := curry( func( a int, b int ) int { return a + b } )
    add5 := csum( 5 )
    r := add5( 2 )
    fmt.Println( r.(int) )
}