On 11/01/2013 12:26 AM, deadalnix wrote:
I think you take it the wrong way. Weak purity have some guarantee in
itself, like you know it won't reach shared data

I assume you mean mutable shared data.

unless you pass them explicitly, do not touch anything static,

Unless you pass it in explicitly.

etc . . .

Consider this:

shared static int x;

auto bar(){
    class S{
        shared(int)* p;
        this(shared(int)* p){ this.p=p; }
        int member(int y)pure{
            return *p=y;
        }
    }
    auto s=new S(&x);
    return &s.member;
}

/+
auto bar_prime(){ // does the same thing. (but is rejected by DMD)
    return (y)pure=x=y;
}+/

auto foo(int delegate(int)pure dg, int x)pure{
    return dg(x);
}

void main(){
    auto a=bar(); // note: a is pure
    assert(x==0);
    foo(a,2); // note: foo is weakly pure
    assert(x==2);
    foo(a,3);
    assert(x==3);
}

Reply via email to