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

Reply via email to