On Sunday, 28 June 2015 at 09:19:16 UTC, Tofu Ninja wrote:
module main;
import std.stdio;
void main(string[] args)
{
auto d = foo();
writeln(d()); // prints 25
}
auto foo()
{
int x = 4;
pure int delegate() d = delegate()
{
return x*x;
};
writeln(d()); // prints 16
x = 5;
writeln(d()); // prints 25
return d;
}
I can see that after foo returns, then d will truly be pure as
x will no longer be modifiable, but just before that, it seems
d is not actually pure. Is this the intended behavior?
Just guessing: The context is treated as an implicit parameter of
`d` (analogous to `this` for a struct/class). Access to `x`
counts a access through a parameter and therefore doesn't violate
purity.