...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

std.bind for D2.0

「かなしいときー.」
「「かなしいときー.」」


「英語のフォーラムに頑張ってバグ報告してみたら,スルーされたときー.」
「「英語のフォーラムに頑張ってバグ報告してみたら,スルーされたときー.」」


「うれしいときー.」
「「うれしいときー.」」


「誰もバグ報告に反応してくれないので自分でバグ取りしてみたらコンパイルできるようになったときー.」
「「誰もバグ報告に反応してくれないので自分でバグ取りしてみたらコンパイルできるようになったときー.」」

--- bind.d      Wed Oct 03 20:39:18 2007
+++ ~bind.d     Wed Oct 03 20:38:20 2007
@@ -263,7 +263,7 @@
        }


-       string toString() {
+       char[] toString() {
                return "()";
        }
}
@@ -657,7 +657,7 @@
bind(&foo, tuple(23, 45))
---
*/
-typeof(new BoundFunc!(FT, EmptySlot, Tuple!(ArgList))) bind(FT, ArgList...)(FT
fp, ArgList args) {
+typeof(new BoundFunc!(FT, NullAlias, Tuple!(ArgList))) bind(FT, ArgList...)(FT
fp, ArgList args) {
        auto res = new DerefFunc!(ReturnType!(bind));
        res.fp = fp;
        extractBoundArgs!(0, 0, ArgList)(res.boundArgs, args);


========= main.d for experimental code
import std.stdio, std.bind;
void main()
{
    writefln("-less");
    bool less(int a, int b){return a<b;}
    auto less5 = bind(&less, _0, 5);
    foreach (i; 0..7)
    {
        writefln(i, "<5 ", less5(i));
    }

    writefln("-greater");
    auto greater = bind(&less, _1, _0);
    auto greater3 = bind(greater.ptr, _0, 3);
    foreach (i; 0..7)
    {
        writefln(i, ">3 ", greater3(i));
    }
}

=============
>dmd main
C:\D\dmd\bin\..\..\dm\bin\link.exe main,,,user32+kernel32/noi;

>main
-less
0<5 true
1<5 true
2<5 true
3<5 true
4<5 true
5<5 false
6<5 false
-greater
0>3 false
1>3 false
2>3 false
3>3 false
4>3 true
5>3 true
6>3 true

http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.bugs&article_id=12352


それと,bind して作った疑似関数 greater が普通の関数ではないため,普通の関数と同じようにアドレス演算子(&)を使うことができない.

    auto greater = bind(&less, _1, _0);
    //auto greater3 = bind(&greater, _0, 3); // こう書きたい
    auto greater3 = bind(greater.ptr, _0, 3);

こういうときのために bindAlias があるのだろうか?
でも bindAlias はまだ動かない.
使い方を間違っているのか,それともやはりバグがあるのか,どっちだろう.
もう少しコードを読んでみよう.

追記

普通の関数に対する bindAlias は使えるようにすることができた.

    writefln("-less (bindAlias)");
    auto less2 = bindAlias!(less)(_0, 2);
    foreach (i; 0..7)
    {
        writefln(i, "<2 ", less2(i));
    }

やったね.
でもまだ bind して作った疑似関数 greater をさらに bindAlias することはできない.
ううむ,どうしたもんかな.

追記

あ,しまった,diff でオリジナルと更新後のファイルを指定する順序が逆だ.