On Jul 10, 2009, at 12:44 PM, Perry Smith wrote:
On Jul 10, 2009, at 1:58 PM, Laurent Sansonetti wrote:
Indeed, raising an exception is very slow for us since we use C++
exceptions, but it's only used in exceptional cases, or in very
explicit use cases like returning from a block (the other return
statements don't use an exception). Also the new runtime in the
upcoming version of Mac OS X seems to be faster.
I'm not sure we are both on the same page yet.
In your examples:
1.times { p 42 }
after the "p 42" there is a return. Perhaps not a return statement
but a return. Also, there is no ensure and no way to put an ensure
in without a "begin / end" pair.
In this example there is obviously no return statement, so it will be
cheap.
The block value or the break statement don't use this mechanism.
So, what I'm suggesting is to make:
begin
foo
return here
rescue
dog
end
be the special case. Not:
1.times { return 18 }
I'm guessing that is what you are doing but I wasn't sure.
What about the following:
def foo
1.times { return 42 }
p :nok
end
foo
In this case, you need a way to return the current method from the
block to not execute the "p :nok" expression.
Unwinding the stack is a way to implement this.
Now, consider:
def foo
begin
yield
ensure
p :ok
end
end
def bar
foo { return 42 }
end
p bar
Here you don't have a choice, since you need to honor the ensure block.
In Ruby, return is semantically similar to an exception in some cases.
This is unfortunate :-)
Laurent
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel