日本Rubyの会 公式Wiki - 第32回 Ruby勉強会@関西 に行ってきました.なんだかんだでひさびさのRuby勉強会でたのしかった! 運営のみなさまおつかれさまでした.
勉強会に行くと,普段得られない刺激がいろいろ得られて良いですね.日常生活はパターンに押し込めがちでだれてくるので,定期的に非日常に自分をもってくのは,精神衛生上よろしいです.
全般的な詳細については,日本Rubyの会 公式Wiki - 第32回 Ruby勉強会@関西の続々よせられるであろうトラックバックや(とおもったらなんか無効になってる),いっしょに行っていっしょにさくさく迷った,id:hitode909くんの第32回 Ruby勉強会@関西に行った - hitode909の日記というエントリを参照してみてください.
今回はサイロスさんのFiberについてのセッションがおもしろかったので,Fiberについていろいろコードを書いてみました.
Fiberのお勉強
FiberというとRuby1.9から搭載されたノンプリエンプティブなコルーチンの仕組みです.といっても,正直使いどころがよくわからない機能だなーと思っていました.だいたい良くあるサンプルとして,
みたいなのがありますが,何に使うのこれ?みたいな感じで,Fiberのおいしさがよくわからないです.
そんな折,今回のセッションで紹介されて気づいたのですが,FiberはGeneratorを実装するのに,ちょうど良い機能なんですね.例えば,良くあるGeneratorとしてCounterとかFibonacci数列を精製器をFiberを使って書くと
generator_not_class.rb · GitHub
みたいになります.なかなかスッキリ書けますね.実際Ruby1.9のEnumeratorのメソッドではFiberをGeneratorとして使いまくってるらしいです.ちなみに1.8.7のEnumerable::Enumeratorではcallccを使っているそうな…
GeneratorとしてのFiberの使いどころはなかなかありそうです.Generator意外のLazyな処理を書くのに便利そうで,callccのあるschemeや遅延評価なHaskellでの手法をまなんでおけばここぞというときに使えそうですね.
おまけ
ついでに,他の言語でGeneratorを書いてみた.
Perl
Generator構文はないので,クラスで状態を管理して必要に応じてあたいを生成するコードをちまちま書く必要があった.こういうのをすっきり書けるモジュールとかあるのかしらね.
JavaScript [追記 22:04]
generator構文て処理系によってはもっていたような? あとで調べる
とかいってたら,やっぱり,JavaScript 1.7からはgeneratorが使えるようだった.JavaScript 1.7 の新機能: Days on the Moonにまんますぎる解説がががが.id:nanto_vi++
Firefoxのためだけにコード書くのならこういう機能をどんどん使っていきたいすなー.GreaceMonkeyとかFirefox拡張とかそういうシーンはそこそこある気がする.