On 31 Jul 2009, at 11:54 , Iain King wrote:
On Jul 31, 8:28 am, Steven D'Aprano <st...@remove-this-
cybersource.com.au> wrote:
On Thu, 30 Jul 2009 18:06:31 -0500, Robert Kern wrote:
On 2009-07-30 16:44, r wrote:
On Jul 30, 4:29 pm, Emmanuel Surleau<emmanuel.surl...@gmail.com> wrote:
1.) No need to use "()" to call a function with no arguments. Python
-->  "obj.m2().m3()" --ugly
   Ruby -->  "obj.m1.m2.m3"  -- sweeet!
Man, i must admit i really like this, and your code will look so much
cleaner.
It has benefits - code does look better. It has also significant cons
- it is ambiguous.
For instance:

a = b

Is b a variable or a method called without parameter?

Hello Emanuel,
Again, who so ever names a method with such a non-descriptive name will
get whats coming to him. And if you did for some reason use such a
cryptic name as "b", do yourself (and everyone else) a favor and follow
it with "()" to denote the method call. Remember when something is
optional that means you have an option to use it OR not use it.

I believe his point is that it is ambiguous to the compiler, not humans reading the code. Python functions and methods are first class objects. They can be passed around. If they were auto-called, then you could not
do this.

Oh my, "r" is still around is he??? And now he's singing the praises of Ruby, the language which he treated as the Devil's Spawn when he first
arrived. That's hilarious.

But back on topic... "r" has missed the point. It's not that a=b is hard
to understand because b is a poor name. The example could have been:

def factory_function():
    magic = time.time()  # or whatever
    def inner():
        return magic
    return inner

my_function = factory_function

It's still ambiguous. Does the programmer intend my_function to become
factory_function itself, or the output of factory_function?

Not only that - does 'return inner' return the function inner or the
result of function inner?

How does ruby pass a function as an object?
Ruby doesn't have functions as such. It has methods and blocks (which would be anonymous functions). `def` always creates methods.

To get a (bound) method object, you simply call `method` on an instance e.g. `foo.method(:bar)` is equivalent to `foo.bar` in Python (it returns a bound method object without calling it).

Blocks are usually created as part of the calls: `foo.bar {do_something}` the part between braces (braces included) is a block, which will be passed to the method `bar`. Sadly, Ruby's blocks are magical syntax (doesn't mean they have to be, in Smalltalk there's nothing magical about blocks for instance) so you can't just do `foo = {do_something}`, you have to turn them into `Proc` objects with the `proc` constructor (or `lambda`, it's equivalent and looks better so I'll use that): `foo = lambda {do_something}`. If you use the magical syntax previously shown, Ruby handles the turning of a block into an actual `Proc` instance.

And since Ruby doesn't have a `()` operator, it uses a method instead (`#call`), so you simply do `foo.call` to execute the proc and get its value.

All in all, much like Smalltalk, Ruby tends not to favor raw functions the way Python does, so a direct translation of the Python code doesn't make much sense.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to