Haskeller にして Rubyist のみなさん今晩は!
最近は勉強の隙を見付けては rupircdを弄っている日々です。
今日はコマンドの処理を IRCServer#recv_message で一括してやっていたのを on_privmsg とか on_notice とかで分業させることでコマンド拡張をし易くしたのですが。
この時にこんなコードを書いてエラーになってしまったのです!
msg = Message.parse(line) params = msg.params @used[msg.command.upcase][0] += 1 mtd = "on_" ++ msg.command.downcase if respond_to?(mtd) __send__(mtd, user, params) else raise UnknownCommand.new(msg.command) end
どこが間違っているか判りますか?わかりませんよね?わかるはずがありません!
二,三十分迷った結果、ついに修正すべき箇所がわかりました*1。それは……
mtd = "on_" ++ msg.command.downcase
ここです!え!?なんで!?
……そう。正しくは
mtd = "on_" + msg.command.downcase
であるべきだったのです!
なんで!連結と云えば ++ でしょう!Has考*2……
Ruby はクラスがどうとかポリモーフィズムがどうとかいうことで、合体系は全部 "+" にしてるのです!こんな横暴をゆるしていいのでしょうか?否!連結は ++ であるべきです、++でなくてはならない!!
Rubyのヒアドキュメントで定義した函数をHaskellで評価してくれる、yhara さんの rubiskellと云う素敵なライブラリもありますが、私は ++ だけを愛しているので、他の要素は要りません。そして愛していると居っても態々ヒアドキュメントに書く程愛している訳でもありません。と云うか、愛しているのでヒアドキュメントにしなくても書けなきゃいやです!!
と云うことで、愛と正義の為に、ruby-haskell というライブラリを作りました。無駄にgithubです。それは愛だから。あとid:hajimehoshi が require "php" を github で公開しているのでそれに倣いました。
使い方は簡単。
p [1, 2, 3] # => [1, 2, 3] p [1, 2, 3] ++ [2, 3, 4] # => Error! require "haskell" p [1, 2, 3] ++ [2, 3, 4] # => [1,2,3,2,3,4] p "hogehoge" ++ "fugafuga" # => "hogehogefugafuga"
やった ++ つかえてるよ・・・!!!すばらしい!!!
あと今思い付いたのですが、 "ruby-haskell" と書いて "ruby ++ haskell"と読んでください。でんこちゃんからのお願いです!