Pipable Function / Pipable Lambda

http://d.hatena.ne.jp/mb2sync/20061205#p1
これ以前導入しようとしたけれども, lambda functor と組み合わせたときに, lambda functor としての operator| か pipable function の operator| かが曖昧になるから回避してたにゃあ.でも,今よくよく考えたら lambda functor である外皮は直接 pipable とせずに, lambda functor によって wrap されてる action だけ pipable にすればきれいに機能させられる気がしてきた. Boost.Lambda ってそういう構造になってたっけ?なってたはずなんだけれど.も一回 Boost.Lambda のコード読み直すか.多分あまり難しい注文ではないはず.
これが導入できれば, range view 固有に operator| を導入せず, range view を1項の (多相) 関数オブジェクトクラスとして汎化した上で,これに対する piping operation として range view に対する operator| (composition) を定義できる. range view を1項の (多相) 関数オブジェクトクラスとする設計はもともとそうなんだけれど.
ただ, range view を (多相) 関数オブジェクトクラスとして定義すると, object generator と range view の2足のわらじを履かせることができなくなるケースがあるけれどどど.

v | view::sort            // view::sort はデフォルトの ordering を用いた range view として機能
v | view::sort( _1 > _2 ) // view::sort は ordering を明示的に指定した range view を生成する object generator として機能

これができにゃーい.さて,どうするかにゃー. range が range であると non-intrusive に annotate する方法はあるけれどおおおぉぉぉ.そんにゃ面倒くさいことはさせたくにゃーい.

Pipable Function 導入しよう,そうしよう

よし,決めた.

  • Range View を Pipable Function として汎化する設計は極めて魅力
  • Range View と object generator の2足のわらじを履かせるのは責任の分離云々から見てまずい.っていうか view::sort() で良いじゃん.

という理由の下に, Pipable Function の導入と, Pipable Function による Range View の汎化と, Boost.Lambda が生成する actor に対する pipable 化を個人的に超決定.
仕事に1区切りつけたら実装とドキュメント化だだだ.