Of course it's not a hard-and-fast distinction: you can have a closure that dispatches on one of its parameters to do one of several different things, and you can have an instance with only one method. But it's usually valid.
Imagine you have a closure with a function that takes in a string and a list and returns a list. Depending on implementation of the function, you could have the string be the operation you wish to perform. The method name, and the list be the parameters. The returned list is the output.
Getters could pass an empty list and return a list with one entry
Setters could pass a list with a value and return an empty list
And so on :)
Like this:
func NewClosure() func(string, ...float64) []float64 {
x := float64(0)
return func(method string, args ...float64) []float64 {
if method == "setX" && len(args) > 0 {
x = args[0]
return nil
} else if (method == "getX") {
return []float64 { x }
} else {
panic("invalid method")
}
}
}
a := NewClosure()
b := NewClosure()
a("setX", 50)
b("setX", 12)
fmt.Printf("a.X = %v, b.X = %v", a("getX")[0], b("getX")[0])
Runnable example here: http://play.golang.org/p/68NTyEx6_PI like it.
[edit: added working example .. and realized I'm adding to what my parent poster was saying]
Consider this simple syntactic rule: `obj.x` <=> `obj("x")`. With this rule, the usual syntax for a method call, `obj.method(x)`, literally becomes the curried application of a closure, `obj("method")(x)`. You could also add a rule like `obj(x) = y` <=> `obj(set(x, y))`. Then you could define objects a bit like this:
point = (x, y) -> method ->
match method:
"x" -> x
"y" -> y
set("x", newx) -> x = newx
set("y", newy) -> y = newy
"add" -> (pt) -> point(x + pt.x, y + pt.y)
p = point(1, 2)
p.x = 5
print p.add(point(3, 4))
All closures. And the nice thing with that scheme is that meta-programming and reflection become completely trivial. Control over the interface is total. What use is there for "real" objects in this situation? foo.DoSomething()
... // remember not to return
// without foo.Done() called
// (EDITed for clarity:
// foo is the state, that changes,
// so you have to keep track of
// its changes)
foo.Done()
vs DoSomething (func(){
... // don't have to remember
// a thing, no side-effects,
// equivalent of .Done() is
// called afterwards for you
})
EDIT2: exact behavior is not the point, keeping track of things is.If you're considering a language deficient of functions then we can take advantage exactly of the idea that objects can embed functions by having a "callable" thing.
foo#doSomething (object
method call : unit -> unit =
...
end) DoSomething(func() { ... })
becomes DoSomething(new Runnable() {
public void run() { ... }
});
or the longer form class MyAction implements Runnable {
public void run() { ... }
}
DoSomething(new MyAction());
Here it is:
Now I will be the first to admit that I usually just don't get koans. But I think I get this one. Objects and closures are equivalent in the sense that what you can do with one you can do with the other. However, for each particular case one may be better (easier to use, more natural, whatever) than the other. You should use which ever one is the best for each particular problem.This is of course easier if you are using a programming language that natively supports both closures and objects...