2011-05-22-02-無様だけど Lambda - project-enigma

2011-05-22-02-無様だけど Lambda

>> Site top >> weblog >> 月別アーカイブ >> 2011年05月のlog >> 2011-05-22-02-無様だけど Lambda

最終更新日付:2014/01/02 00:00:00


無様だけど Lambda

2011 年 05 月 22 日

Visual Basic にはオペレータオーバーローディングのための仕組みがない。だから、これについては完全にスルーするつもりだったのだ。

「これ」というのは、Lambda のことだ。とりあえず書いてしまうと、Functional ユーティリティに、以下のようなメソッドとして提供される。

Function Lambda(operator As String, v As Variant) As UnaryFunction

パラメータは2つ。operator は、"=", "<>", "<", "<=", ">", ">=" などの文字列で、v は比較対象の値だ。ひとまず、以下のような感じになる。

Dim gv  As GVector
Dim itr As InputIterator

Set gv = Containers.VectorValues(4, 7, 8, 3, 6, 0)
Set itr = Algirithm.FindIf(gv.First(), gv.Last(), Lambda("<", 4))

Debug.Assert (itr.Value = 3)

つまり、これは operator に対応する BinaryFunction を v で Bind2nd した結果の UnaryFunction を返却する。すなわち、上記の Algirithm.FindIf は以下と同じだ。つまり、構文糖に過ぎない(ちなみに、上記は正確には Functional.Lambda と表示することになる)。

Set itr = Algirithm.FindIf(gv.First(), gv.Last(), _
                           Functional.Bind2nd(New Less, 4))

C++ の世界であれば、operator<() などがオーバーロードできるから、lambda でかなり色々なことができる。しかし、Visual Basic ではそれは望むべくもない。結果として、Lambda はメソッドであり、比較演算子を文字列で渡すという無様なものになった。値として渡せるのも、事実上数値と文字列だけだ(あ、日付型とかもいけるか)。

Lambda の第2パラメータに任意のオブジェクトを渡せるようにできないかと思ったが、ひとまず断念。そもそも、単純な数値/文字列のシーケンスに対して上記のような処理を書ける局面はあまりなさそうだから、この Lambda も「作ったはいいが使わない」ものになりそうだ。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : STLとその移植

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.