Ruby, C++のBoost::Lambdaみたいなスタイルでブロック書けるgemつくった

boost_lambda_style_proc

$ gem install boost_lambda_style_proc

名前が長い……
最初はboost_style_lambdaにしようと思ったけどLambdaじゃなくてProcを生成するためのライブラリなので誠実ではない!!!となった結果こうなった(長い)

Boost::LambdaっていうのはC++のBoostという普通のテクニックを駆使したライブラリの一部で、

// 5で割り切れて30より大きい要素を探す。
vector<int>::iterator it = find_if( vec.begin(), vec.end(), _1%5==0 && _1>30 );
http://www.kmonos.net/alang/boost/classes/lambda.html

という書き方ができる。

Rubyで書くなら

[10, 23, 45, 76, 98].select {|x| x%5 ==  0 && x>30}

なんだけど、ここでxってなんなんだよという問題が生じる。私はある要素について注目して、それについての条件を記述したいのに、ブロック引数定義すなわち「ある要素をxと置く」という余計な記述を強要されて、違う、全くそこは本質ではない、ソレで通じるべきなのだ本来は、だがしかし余計なxという名前を明示的に宣言することを余儀なくされ、後続する条件式では意味のないエッックスが、うっ。

そこでboost_lambda_style_proc(長い)を使うと、

require 'boost_lambda_style_proc'
 [10, 23, 45, 76, 98].select &((_1%5 == 0) & (_1>30))

アッ、ハイ。カッコが増えましたね。それはともかく、思考を乱す余計な引数定義がなくなったんですよ。スゴクないですか? 今注目しているものは_1です。「_1を今注目しているものとする」という定義は必要ない。スゴイですね? &&が&になりましたけどね。どちらかといえばRubyの側に問題があると考えます、そのへんの演算子定義制限については。

例が複雑すぎた。

[1, 2, 3].map &(_1 * 2)

これくらいの例ならボロが出なかったですね……(おわり)