On 11/01/2013 03:21 PM, Kenji Hara wrote:
2013/11/1 Timon Gehr <timon.g...@gmx.ch <mailto:timon.g...@gmx.ch>>

    On 11/01/2013 02:36 PM, Kenji Hara wrote:

        I think this is a good discovery. Currently a pure function can have
        lazy parameters and it is treated as a weakly pure function.

        pure int foo(lazy int x) { return x; }  // OK

        We can think the lazy parameter is a limited case of scope delegate
        parameter.
        ...


    They are. I think it would be quite strange to treat them differently.


I've also felt same thing about it. The proposal will generalize the
language rule.

        And more, I discovered that the purity may be stronger depends
        on the
        given delegate purity.

        void func(scope void delegate(int) dg) pure;

        void main() {
              int num;

              // the function call has weak purity
              func((x){ num = x;});

              // the function call has strong purity
              func((x){ ; });
        }

        Kenji Hara


    Yes. Furthermore, the first delegate should have inferred type 'void
    delegate(int x)pure nothrow @safe' and the second delegate should
    have inferred type 'void delegate(int x)pure immutable nothrow @safe'.


The first delegate should not become pure.

Why not? It is weakly pure, like the following:

void main(){
    struct S{
        int num;
        void member(int x)pure{ num = x; } // pure
    }
    S s;
    func(&s.member); // weakly pure function call
}


So it would become 'void
delegate(int)nothrow @safe'. I agree with the second inference result.

Kenji Hara

Reply via email to