トップ «前の日記(2014-01-29) 最新 次の日記(2014-02-10)» 編集

Route 477



2014-01-30

[ruby] Rubyに「ユーザ定義演算子」を追加するライブラリ、superators

Twitterで衝撃的なgemが流れてきたので調べてみた。superatorsを使うと<----~+~-のような独自演算子をユーザが自由に定義できるようになる。しかも驚くべきことに、Pure Rubyで実装されているのだ。

/Users/yhara/r/superators % irb -Ilib -r superators
irb(main):0>  class Array
irb(main):1>     superator "<---" do |operand|
irb(main):2*       if operand.kind_of? Array
irb(main):3>         self + operand.map { |x| x.inspect }
irb(main):3>       else
irb(main):3*         operand.inspect
irb(main):3>       end
irb(main):2>     end
irb(main):1>   end
=> nil
irb(main):0> [1,2,3] <--- [4,5,6]
=> [1, 2, 3, "4", "5", "6"]
irb(main):0> 

*1

そのトリックは、「任意の演算子が定義できるわけではない」ことにある。実は上の「<---」は、二項演算子「<」と、その後に続く単項演算子「-」の列でできている。superatorは、与えられた演算子名からArray#<とArray#-をオーバーライドし、「a <--- b」という形で呼び出されたときだけ指定のブロックが実行されるような定義を自動的に作成するようだ。

ユーザによる演算子定義はHaskellやScalaで実装されているけど、「名前重要」を旨とするRubyには今後も入らなさそうな気がする*2。それでも力技でこういうことができるのに驚いた。

*1 gem installで入るやつはRuby 1.9移行に対応していないようなので、上の例は https://github.com/neilconway/superators の方をgit cloneして試している

*2 そのようなIssueが立ったことがあるかは調べてないけど