26 April 2014
RubyにおけるYet Another関数合成
Rubyにおける本格的な関数合成については、既に@yuroyoroさんのlambda_driver.gem があるので、僕の出番はありませんが。まあいつもの様にふざけたものなら出せますよ、ということで…。
ProcCompressor
こういった実装です。
使い方
使い方はこうです。
最初に圧縮するProcの数を決めてインスタンスを生成し、これにProcCompressor#<<
でProcオブジェクトを順次圧縮していきます。
pc = ProcCompressor.new(2)
pc << ->n{ n * 2 } << ->n{ n + 5 }
で、最後に値を同じく#<<
を使って投げれば、結果が得られます。
pc << 3 # => 11
Procのセットも結果の取得も、同じ#<<
メソッドで達成できるところがアピールポイントです(何の価値があるかわかりませんが)。同じ入口に計算要素をどんどんpushしていくと最後に結果がpopするというイメージです。これはinjectでProcを畳み込んで、Proc#curry
に引数を渡すことでこれが駆動するようにして実現しています。
#to_proc
も定義してあるので、&引数として渡すこともできます。
pc = ProcCompressor.new(2)
pc << ->n{ n * 2 } << ->n{ n + 5 }
[1, 2, 3, 4, 5].map(&pc) # => [7, 9, 11, 13, 15]
pc = ProcCompressor.new(3)
pc << :to_s.to_proc << ->s{ s + 'ist' } << :upcase.to_proc
[:ruby, :violin, :novel].map(&pc) # => ["RUBYIST", "VIOLINIST", "NOVELIST"]
pc = ProcCompressor.new(1)
between5to10 = ->n{ n.between? 5, 10 }
pc << between5to10
[*1..15].select(&pc) # => [5, 6, 7, 8, 9, 10]
ちょっとユニークでしょ?
参考記事:
関連記事:
(追記:2014-4-27) 説明とコードを少し追加しました。
=== Ruby関連電子書籍100円〜で好評発売中! ===
blog comments powered by Disqus