Voldemort declarations inside structs with ctor initialization

Meta via Digitalmars-d digitalmars-d at puremagic.com
Tue May 27 13:02:33 PDT 2014


On Tuesday, 27 May 2014 at 19:39:23 UTC, Idan Arye wrote:
> Hashing the function body is not enough - you must also 
> consider the closure!
>
>     template Template(alias func){
>         bool Template=func();
>     }
>
>     void foo(){
>         int a;
>         writeln(Template!(()=>is(typeof(a) : char))); //prints 
> "false"
>     }
>
>     void bar(){
>         char a;
>         writeln(Template!(()=>is(typeof(a) : char))); //prints 
> "true"
>     }
>
> If two delegates must have exactly the same scope, the 
> usefulness of the hashing will be quite limited, but in many 
> cases the same lambda can be declared in different scopes and 
> still be the same. It all depends on how the lambda uses the 
> closure - and checking this will be quite hard to implement...

If I remember correctly, the main use-case of comparing lambda 
functions was for cases like this:

auto rb1 = make!(RedBlackTree!(int, (a, b) => a < b))([4, 2, 3, 
1]);
auto rb2 = make!(RedBlackTree!(int, (a, b) => a < b))([4, 2, 3, 
1]);
assert(is(typeof(rb1) == typeof(rb2))); //FAIL
assert(rb1 == rb2); //FAIL

Note that this code passes if you define a top-level function 
"less" and pass it to make. Functions don't have function 
pointers, only delegates, so as a first step we could implement 
hashing for functions, which don't have to deal with all this 
context pointer business. Also, couldn't you achieve the same for 
delegates if you specify that only @pure @nogc delegates can be 
compared?


More information about the Digitalmars-d mailing list