Ruby勉強会@関西でFiberについて勉強してきた

日本Rubyの会 公式Wiki - 第32回 Ruby勉強会@関西 に行ってきました.なんだかんだでひさびさのRuby勉強会でたのしかった! 運営のみなさまおつかれさまでした.

勉強会に行くと,普段得られない刺激がいろいろ得られて良いですね.日常生活はパターンに押し込めがちでだれてくるので,定期的に非日常に自分をもってくのは,精神衛生上よろしいです.

全般的な詳細については,日本Rubyの会 公式Wiki - 第32回 Ruby勉強会@関西の続々よせられるであろうトラックバックや(とおもったらなんか無効になってる),いっしょに行っていっしょにさくさく迷った,id:hitode909くんの第32回 Ruby勉強会@関西に行った - hitode909の日記というエントリを参照してみてください.

今回はサイロスさんのFiberについてのセッションがおもしろかったので,Fiberについていろいろコードを書いてみました.

Fiberのお勉強

FiberというとRuby1.9から搭載されたノンプリエンプティブなコルーチンの仕組みです.といっても,正直使いどころがよくわからない機能だなーと思っていました.だいたい良くあるサンプルとして,


transfer.rb · GitHub

みたいなのがありますが,何に使うのこれ?みたいな感じで,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を書いてみた.

Python

もともとgenerator構文があるので,veryスッキリ


generator.py · GitHub

Perl

Generator構文はないので,クラスで状態を管理して必要に応じてあたいを生成するコードをちまちま書く必要があった.こういうのをすっきり書けるモジュールとかあるのかしらね.


generator_like.pl · GitHub

JavaScript [追記 22:04]

generator構文て処理系によってはもっていたような? あとで調べる

とかいってたら,やっぱり,JavaScript 1.7からはgeneratorが使えるようだった.JavaScript 1.7 の新機能: Days on the Moonにまんますぎる解説がががが.id:nanto_vi++

Firefoxのためだけにコード書くのならこういう機能をどんどん使っていきたいすなー.GreaceMonkeyとかFirefox拡張とかそういうシーンはそこそこある気がする.