ちょっと必要に駆られて、 Wormhole というライブラリを書きました。

350px-Worm3.jpg

インストールはGitHubから行えます。

   1  sudo gem sources -a http://gems.github.com
   2  sudo gem install genki-wormhole

メソッドの内部を実行中に、呼び出し元に一旦処理を戻し、 中断した場所から処理を継続する機能を提供します。

例えば、以下のようなプログラムに対して、

   1  require 'rubygems'
   2  require 'wormhole'
   3  
   4  def foo
   5    puts "foo"
   6    Wormhole.throw :foo => 'hello' do |data|
   7      puts data[:foo]
   8    end
   9    puts "bar"
  10  end
  11  
  12  Wormhole.catch do
  13    foo
  14  end.return do |data|
  15    puts data[:foo]
  16    data[:foo] = 'world!'
  17  end

結果として、以下のような出力を得ます。

   1  foo
   2  hello
   3  world!
   4  bar

処理を中断したいところで Wormhole.throw を呼び出して、 外側から Wormhole.catch で受け止めます。 catchが完了したら、Wormholeオブジェクトが返るので、 returnで中断箇所に戻ります。 Wormhole.throw はHashを受け渡すことができます(省略可能)。 また、catchブロックとreturnは上記の例のように続けて記述します。 catchの戻り値を適当な変数に代入して、後でreturn を呼び出すことも可能ですが、その場合、catchを抜けた直後から returnを呼ぶまでの区間が二度実行されてしまいます (この辺が最初に例外を使って実装してた理由ですね)

中断箇所から処理を再開するために callcc を使っています。 callccは面白いですね。

更新履歴

  • 2008/7/4 例外処理をやめてthrow/catchを使うようにしました。それにあわせて本文を修正しました。
posted by Png genki on Thu 3 Jul 2008 at 20:06 with 5 comments

Comments:

Face Yuumi3 almost 16 years ago.

継続は面白いですよね。 でも Continuation Fest 2008 で笹田さんは、いかにRubyで継続を使わせないようにするか というプレゼンをしてました :-) http://www.atdot.net/~ko1/pub/ContinuationFest-ruby.pdf

Png 瀧内元気 almost 16 years ago.

はは。

なんとか生き残ってくれるといいなぁ。

Face yugui almost 16 years ago.

例外よりthrowのほうがAPI的に良くないですか?

Png 瀧内元気 almost 16 years ago.

おおなるほど。確かにそうですね。改良してみます。

Png 瀧内元気 almost 16 years ago.

version 0.1.0 以降より、catch/throwを使う実装にしました。

or Preview
Social Bookmarks
  • Delicious
  • B_entry651
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ