Sam Kong wrote:
> Hi!
> 
> A friend of mine challenged me with Smalltalk.
> He's a big fan of Smalltalk.
> He asked me what I can do if I want to add "try ~ finally ~" systax in
> Ruby.
> Yes, we already have "begin ~ ensure ~".
> But he asked me whether Ruby is flexible enough to extend such a thing
> without changing the language itself.
> He said that Smalltalk doesn't have "try ~ finally ~" in the language
> but can be defined without changing the language.
> 
> Personally, I don't think such flexibility is really needed.
> However, I want to defend Ruby.
> How would you react such an attack?

There are several ways this could be done ... here is one:

  class TryFinally
    def initialize(block)
      @block = block
    end
    def finally
      @block.call
    ensure
      yield
    end
  end

  def try(&block)
    TryFinally.new(block)
  end

Usage:

  try {
    puts "Trying"
    fail "oops"
  }.finally {
    puts "Always printed"
  }

It is a bit little easier in Smalltalk because of the use of keywords in 
an argument list, but still quite doable in Ruby.

--
-- Jim Weirich

-- 
Posted via http://www.ruby-forum.com/.