[Issue 1541] std.bind is broken?

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Dec 18 11:22:24 PST 2008


http://d.puremagic.com/issues/show_bug.cgi?id=1541


rayerd.wiz at gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
 Attachment #188 is|0                           |1
           obsolete|                            |
 Attachment #195 is|0                           |1
           obsolete|                            |




------- Comment #5 from rayerd.wiz at gmail.com  2008-12-18 13:22 -------
Created an attachment (id=283)
 --> (http://d.puremagic.com/issues/attachment.cgi?id=283&action=view)
Fixed std.bind for dmd2.022 within limitations

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

        writefln("(bind(&less, 5, _0))");
        auto not_less5 = bind(&less, 5, _0);
        for (int i=0; i<7; ++i)
        {
                writefln(i, ">=6 ", not_less5(i));
        }

        writefln("(bind(&less, 3, 5))");
        auto less_3_5 = bind(&less, 3, 5);
        writefln("3<5 ", less_3_5());

        writefln("(bind(&less, 5, 3))");
        auto less_5_3 = bind(&less, 5, 3);
        writefln("5<3 ", less_5_3());

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

        writefln("(bindAlias!(less)(_0, 2))");
        auto less2 = bindAlias!(less)(_0, 2);
        for (int i=0; i<7; ++i)
        {
                writefln(i, "<2 ", less2(i));
        }

        writefln("(bind(&foo, bind(&bar, _0)))");
        int foo(int i) {return i*2;}
        int bar(int i) {return i*3;}
        auto fooBar = bind(&foo, bind(&bar, _0));
        writefln(fooBar(5));

        //
        // Limitations
        //

//      writefln("(bindAlias!(greater)(_0, 4))");
//      auto greater4 = bindAlias!(greater)(_0, 4);
//      for (int i=0; i<7; ++i)
//      {
//              writefln(i, ">4 ", greater4(i));
//      }

//      auto fooFooBar = bindAlias!(foo)(bindAlias!(fooBar)(_0));
//      auto fooFooBar = bindAlias!(foo)(bind(fooBar.ptr, _0));
//      writefln(fooFooBar(5));
}

I:\bind_repair>main
(bind(&less, _0, 5))
0<5 true
1<5 true
2<5 true
3<5 true
4<5 true
5<5 false
6<5 false
(bind(&less, 5, _0))
0>=6 false
1>=6 false
2>=6 false
3>=6 false
4>=6 false
5>=6 false
6>=6 true
(bind(&less, 3, 5))
3<5 true
(bind(&less, 5, 3))
5<3 false
(bind(bind(&less, _1, _0).ptr, _0, 3)
0>3 false
1>3 false
2>3 false
3>3 false
4>3 true
5>3 true
6>3 true
(bindAlias!(less)(_0, 2))
0<2 true
1<2 true
2<2 false
3<2 false
4<2 false
5<2 false
6<2 false
(bind(&foo, bind(&bar, _0)))
30


-- 



More information about the Digitalmars-d-bugs mailing list