On Friday, 21 March 2014 at 19:19:06 UTC, Walter Bright wrote:
Here's a litmus test you can use for purity. Consider:

    int foo() pure;
    {
        auto a = foo();
    }

Now, since 'a' is never used, we can delete the assignment, and since foo is pure, we can delete foo():

    {
    }

Is this program distinguishable from the former? If not, then foo() is not pure.

Consider this:

int foo(int* pa) pure
{
    if (pa)
    {
        *pa = foo();
    }
}

This is also pure according to D's type system, but it fails your litmus test. This, however, passes:

int foo(immutable(int)* pa) pure
{
    pa = pfoo();
}

I think the case of a monitor is closer to the first example.

Reply via email to