VBGenericの最近のブログ記事

なんと、5ヶ月振り

| コメント(3) | トラックバック(0)

...ですね。こんな長い間何をしていたのかと言えば、結婚してました。いや、すぐに離婚したとかいう意味ではありません。準備とか準備とか準備とかで忙しかったわけです。一応峠は越したので、こうして報告している次第です。

 

 という書き出しではどうしても「ですます」調になるが、ここから戻す。婚礼の準備の裏で細々と何をやっていたかといえば、VBGeneric の Visual Basic 2008 対応。ちょっと気が向いて調べたら、Visual Basic の Generic 機能がかなり充実してきたようなので、頑張ってやってみようと思った次第。実装は既に完了していて、全ての機能に簡単に電気を通す作業をやっている。それが終わったらドキュメントを書いて、それでようやくリリースとなる。自分で使うかどうかはわからない。誰か使ってくれる人がいるかどうかもわからない。わからない事だらけで先が見えないが、自分の結婚生活までそうならないように願う。

 

 

 VBGeneric では、メソッドを跨いで渡された反復子を移動させる場合、コピーを明示的に作成せねばならない。その理由は、Visual Basic のオブジェクト渡しの方式にある。オブジェクトの引数渡しは全て参照渡しになるため、オブジェクトの変更は呼び出し元に波及する。そして、反復子もオブジェクトだから、その移動が呼び出し元に波及しないようにするには、どこかでオブジェクトのコピーを作る必要がある。今回はそこにある「無駄」の話。

 

 C++ 0x で追加される for の新しい使い方から、そんなことを考えた。

 

追加検討中のコンテナ

| コメント(0) | トラックバック(0)

 C++ 0x で追加されるコンテナとして、以下のものがあるらしい。

  • forward_list
  • unordered_set
  • unordered_multiset
  • unordered_map
  • unordered_multimap

 これを VBGeneric に取り込むかどうかで、しばらく悩んでいる。

 forward_list については、試しに実装をしてみたが、どうにもイマイチなのだ。insert が insert_after になったり size がなかったり、そうまでして単方向リストって必要なモノだろうか、と思ってしまう。いや、C++ 標準ライブラリとしてはあって良いと思うし、必要な局面もたしかにあるだろう‥‥‥しかし、それがそのまま VBGeneric にスライドできるかどうかが問題なのだ。そして、ハッシュに関しては、まだ試しの実装もしていない。正直に書いてしまえば、面倒くさい。

 有体に言って、確実に存在することがわかっているユーザが自分だけ、という状況では、自分が必要としない機能というのは永遠に先送りになる。今後の検討の結果も正直心許ない。

 

無様だけど Lambda

| コメント(0) | トラックバック(0)

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

 

 Tuple の初期化方法から、コンテナの初期化方法がもうひとつあることに気付いた。

 

Numeric.Iota

| コメント(0) | トラックバック(0)

 昨日書き忘れていたが、追加したアルゴリズムには Numeric.Iota があった。以下のようなもので、これも C++ 0x への対応だ。

 Public Sub Iota(itr1 As ForwardIterator, itr2 As ForwardIterator, ByVal v As Long)


 ざっくり、以下のようになるらしい。

    Dim gv As New GVector

    gv.Resize(5)
    Call Numeric.Iota(gv.First(), gv.Last(), 0)

    Debug.Assert (gv.IsEqual(Containers.VectorValues(0, 1, 2, 3, 4)))


 個人的にはライブラリに追加するほどのものには見えないが‥‥‥まぁ、対応できる部分は全てする、が方針なので。

アルゴリズムの追加

| コメント(0) | トラックバック(0)

 VBGeneric イジりは続く。

 

Tuple の追加

| コメント(0) | トラックバック(0)

 5年振りに、VBGeneric をイジろうと思いたった。

 

 

VBGeneric version 1.03.356.001

| コメント(0) | トラックバック(0)

 さて、陰郎個人としてはもっとも思い入れがあるにも関わらず1番不人気かもしれない作品、VBGeneric の4ヶ月ぶりのアップデートである。今回はファンクタの仕様変更ということで、旧バージョンとのバイナリ互換性はない。つまり、旧バージョンを使用してコンパイルしたものについては、リコンパイルが必要ということだ。

 具体的にどのような変更が加わったかについては、以前書いたとおりだ。ファンクタインタフェイスである UnaryFunction, BinaryFunction, GenerateFunction の Execute( ) メソッドがクラスの既定メソッドに指定された。これによって、Execute( ) メソッドを明示的に呼び出さなくても、あたかも C++ のファンクタのごとく operator( ) が実装されているかのように使用できる。以下のように。

 Dim func As BinaryFunction
 Dim ret As Long

 Set func = New FooFunc
 ret = func( 5, 3 )

 

 ちょっと厄介なのは、これらのファンクタインタフェイスを実装するユーザークラスでも Execute( ) を既定メソッドに指定することが仕様上要求されることだ。例えば、上記の FooFunc がその仕様上の要求を満たしていない場合、上記コードは OK でも以下のコードはコンパイルエラーとなる。

 Dim func As New FooFunc
 Dim ret As Long

 ret = func( 5, 3 )  '// コンパイルエラー!

 

 実際のところ、ファンクタはインタフェイス経由で使用するべきなので、この点はそれほど心配はしていない。しかし、問題はもうひとつある。VBA 環境でファンクタを自作する場合、そもそも既定メソッドの指定ができないらしいのだ。これは環境上の制約としてドキュメントしておいた。

 あとは、以前書いたとおり、スコープ外のオブジェクト( 要するにクラスメンバとか大域オブジェクト )に対して復帰値を利用しない形式で既定メソッド呼び出しを使った場合にエラーが発生する。この点についてもドキュメントした。正直制約が多いが、なんとなく STL っぽい書き方ができるようになったので個人的には気に入っている。

 ...というわけで、2006 年最初の仕事は奇しくも VBGeneric となった。さて、Palmware に取り掛かるか...( おいおい正規表現エンジンはどうなった? )

このアーカイブについて

このページには、過去に書かれたブログ記事のうちVBGenericカテゴリに属しているものが含まれています。

前のカテゴリはScroogeです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

  • archives
Powered by Movable Type 5.04