著作一覧 |
マイクロソフトの荒井さんにお誘い頂いて、Tech Fielders セミナー 東京 [邪道編〜Ruby × Windows で出来ること]でセッションを持つことになりました。
なんといっても注目したいのは、荒井さんのIronRubyセッションですね。
一方、僕のセッションは、札幌Ruby会議01で行ったASR(Ruby on Windows)セッションをリバイズして、DLやWin32OLE、SWin、DXRubyなどのデモを交えたものにしようと考えています。
というわけで、.NET上のRubyとWin32上のRubyがOSTに並ぶ日ということになります。
OSTの近くには紀伊國屋書店の1階もあれば、クリスピークリームドーナツ(さすがに今は普通に買える)とかもあるので、お誘いあわせのうえ、来ていただければいいなぁと思います。
参照:荒井さんのBlogでの告知。
というか、実は邪道編10周年記念なんだなぁと月日の流れにはうんざりしますね。
乗りかかった船なので、今度は複数の文字を含む区間の検索をHaskellでやってみようとしたが、1時間くらいいじっていても作れない。
もしかして考え方が間違っているのかと、ためしにRubyで作ってみたら10分かからずにできた(どうやるかはHaskellで書こうとした時に考え済みだったので、実装時間ということかな。でもほとんどはEnumerator#find_allの名前が思い出せなくてirbをいじくっていた時間だったりする)。(下のリストは推敲後なので実際には40分くらいになったけど、出力内容の重要な点は最初のバージョンからそんなに変わってはいない)
class String def exclude?(x) !include?(x) end def each_char_with_index i = 0 each_char do |x| yield x, i i += 1 end end end def add(c, i, b, key) b.map do |e, k| if e.size == 1 && k.exclude?(c) k << c if k.size == key.size e << i end end [e, k] end end text = 'program-promenade' key = 'pma' bag = [] text.each_char_with_index do |x, i| if key.include? x bag << [[i], ''] add(x, i, bag, key) end end bag = bag.find_all do |e, k| k.size == key.size end p bag
どうも解答例を見るとおれのやり方と違ってえらく空間の使い方が良いが、でも同じ長さだった場合の列挙のための保存とか無視しているから、結局は同じようになりそうな気もする。
で、Rubyで書いたらあまりに簡単に書けたので、逆になんでこうもHaskellで書くのが大変なのかなぁと考えると、結局、あまりにもライブラリ関数を知らないのが問題のような気がしてきた。少なくともpreludeで読まれる関数くらいは覚えておくべきなんだろうな。
ただ、手続き型言語だと用意されている関数(オブジェクト)を知らなくても自分で手続きを書いていけばどうにでもなるのだが、関数型だと手続き(つまり手順)が書けないので、知らないと手も足も出なくなるように感じる(というか手も足も出ない)。そこが手続き型と関数型の一番の違いではないだろうか。
ジェズイットを見習え |
10周年というのは気がついておりました。というのは、今回のことを思案していて、書籍を読み直していたからなんです。