To help LDC/GDC
Walter Bright
newshound2 at digitalmars.com
Wed Apr 10 11:23:07 PDT 2013
On 4/9/2013 1:04 AM, Dicebot wrote:
> 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?
>
> It is valid code. It is "weak pure". "pure' keyword means both
> "strong pure" or "weak pure" depending on function body. Crap.
No, it is weakly or strongly pure based on the parameter types. bar(int n), for
example, has an (implicit) mutable reference to 'this' in its parameter list. To
be strongly pure, bar(int n) would have to be declared as:
const pure int bar(int n);
What the 'pure' keyword says is: "no reads/writes to mutable data from
references that do not come through the parameters." Hence, if the parameters
are all const or immutable, and it is marked pure, then the function is
"strongly pure", meaning "no reads/writes to any externally visible mutable state".
Notably, this is NOT determined by reading the function body, but by examining
the parameter types.
The reason for this behavior is so that strongly pure functions can call weakly
pure struct/class methods, and yet remain strongly pure. Purity in D would be
largely useless otherwise, as very very few functions could be strongly pure.
More information about the Digitalmars-d
mailing list