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

インストールはGitHubから行えます。
1 sudo gem sources -a http://gems.github.c om 2 sudo gem install genki-worm hole
メソッドの内部を実行中に、呼び出し元に一旦処理を戻し、 中断した場所から処理を継続する機能を提供します。
例えば、以下のようなプログラムに対して、
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.t を呼び出して、
外側から Wormhole.c で受け止めます。
catchが完了したら、Wormholeオブジェクトが返るので、
returnで中断箇所に戻ります。
Wormhole.t はHashを受け渡すことができます(省略可能)。
また、catchブロックとreturnは上記の例のように続けて記述します。
catchの戻り値を適当な変数に代入して、後でreturn
を呼び出すことも可能ですが、その場合、catchを抜けた直後から
returnを呼ぶまでの区間が二度実行されてしまいます
(この辺が最初に例外を使って実装してた理由ですね)
中断箇所から処理を再開するために callcc を使っています。
callccは面白いですね。
更新履歴
- 2008/7/4 例外処理をやめてthrow/catc
hを使うようにしました。それにあわせて本文を修正しました。
