
On 04/29/2012 10:28 AM, Lorenzo Bolla wrote:
What's the difference? You're not passing around the actual function, in any language.
$ python Python 2.7.3 (default, Apr 14 2012, 23:17:33) [GCC 4.7.0 20120407 (prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
def f(): ... print 'foo' ... def g(f): ... print 'bar' ... f() ... g(f) bar foo
Also: http://en.wikipedia.org/wiki/First-class_function#Language_support
You're not passing around the function, you're passing around the name of the function or a pointer. Python happens to know that when you write f(), you want to evaluate the function named f, much like when you say f.call() in Ruby. Ruby doesn't even have functions, only methods, so you have to entertain the idea that the same thing can have two different names to even have this discussion. Passing functions to other functions is so fundamental to Ruby that it's baked into the language: irb(main):001:0> [1, 2, 3].map { |x| 2*x } => [2, 4, 6] They're not called functions, but the distinction is imaginary. For an imperative language, the culture pretty strongly encourages you to use map, filter, fold etc. which are all passed functions (Procs) using the block syntax.