On 08/20/2011 06:24 PM, Sean Eskapp wrote:
== Quote from David Nadlinger (s...@klickverbot.at)'s article
On 8/20/11 5:13 PM, Sean Eskapp wrote:
Does marking a member function as pure mean that it will return the same
result given the same parameters, or that it will give the same result, given
the same parameters and given the same class/struct members?
The second one, the implicit this parameter is just considered a normal
argument as far as purity is concerned.
David

Wait, references and pointers are now valid for pure function arguments?

There are different forms of pure functions:

weakly pure:
no mutable globals are read or written. the function may however change its arguments. weakly pure functions are useful mainly for the implementation of functions with stronger purity guarantees.

const pure/strongly pure:
All function arguments are values or const/immutable.

From the type signature of a function, you can always tell which form of pure function it is:

int foo(ref int, int) pure; // weakly pure, could change first argument
int bar(const(int)*, int) pure; // const pure
int qux(immutable(int)*, int) pure; // strongly pure


Weakly pure member functions can therefore change the other members:

struct S{
    int x;
    int foo() pure; // weakly pure, could change x
    int bar() pure const; // const pure, cannot change x
int qux() pure immutable; // strongly pure, only works with immutable instances
}

The rationale of this:
Consider

int baz(int x) pure{
    S s=S(x);
    S.foo();
    return s;
}

This is clearly strongly pure code. If we had no weakly pure, this could not be written in that way.


Reply via email to