Pure delegate not quite pure?

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jun 28 03:12:45 PDT 2015


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.


More information about the Digitalmars-d-learn mailing list