[Issue 9148] 'pure' is broken
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sat Jul 4 10:35:26 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=9148
--- Comment #18 from timon.gehr at gmx.ch ---
(In reply to Kenji Hara from comment #17)
> (In reply to timon.gehr from comment #16)
> > I think this is not right. Why should impure nested functions not be able to
> > access the enclosing context corresponding to frames of pure functions?
>
> Because the nested impure function may modify the context of other pure
> functions.
>
> int g;
> int impureFuncCall() { return g; }
>
> auto func(out int delegate() pure pureDg, out void delegate() impureDg) pure
> {
> int x = 1; // become a closure variable
>
> int foo() pure // weak purity
> {
> return x;
> }
>
> auto bar()()
> {
> // modify the context of pure funciton 'foo'
> // depending on the global state,
> if (impureFuncCall())
> x = 2; // !!
> }
>
> pureDg = &foo;
> impureDg = &bar!();
> }
>
> void main()
> {
> int delegate() pure pureDg;
> void delegate() impureDg;
>
> func(pureDg, impureDg);
>
> assert(pureDg() == 1);
>
> g = 1; // modify the global state
> impureDg(); // modify the context of pureDg.
>
> assert(pureDg() == 1); // fails~
> }
I understand. My question was why you consider this to be a _problem_.
pureDg is weakly pure. I can change the context of a weakly pure delegate
depending on global state in other ways if I want to.
--
More information about the Digitalmars-d-bugs
mailing list