To help LDC/GDC

Zach the Mystic reachzach at gggggmail.com
Tue Apr 9 01:21:06 PDT 2013


On Tuesday, 9 April 2013 at 07:57:37 UTC, Manu wrote:
> Are you saying the example above is not actually valid code?
>
> struct Foo {
>     int a = 0;
>     pure int bar( int n ) { // Weakly pure
>         a += n;
>         return a;
>     }
> }
>
> That's not pure. Call it twice with the same args, you'll 
> different
> answers. How can that possibly be considered pure in any sense?
> And it's useless in terms of optimisation, so why bother at 
> all? What does
> it offer?

deadalnix answered but too briefly it seems. I think the reason 
it's pure is because a struct's member functions are actually a 
kind of syntax sugar. Foo.bar above is rewritten underneath as 
something like:

pure int __Foobar(ref Foo __f, int n) {
     __f.a += n;
     return __f.a;
}

Therefore if a were defined outside the struct,

int a = 0;
struct Foo {
     pure int bar( int n ) {
         a += n; // Epic fail
         return a;
     }
}

... it would fail completely, but 'a' is a struct field and so 
passed by hidden pointer to the member function, which is 
therefore in essence weakly pure.


More information about the Digitalmars-d mailing list