Steven Schveighoffer wrote:
A pure function also cannot modify any data via its parameters. In
other words, its parameters must be transitively const.
Yes, a strongly pure function must have those traits.
No, that would be a weakly pure one.
But, purity exists to allow for optimization. A weakly pure function
cannot be optimized anymore than a normal function, but a strongly pure
can still be optimized even if it calls weakly-pure functions.
I'll give you an example (with a new keyword to help you understand the
difference):
weaklypure void reverse(int[] x)
{
for(int i = 0; i * 2 < x.length; i++)
swap(x[i], x[$-1-i]);
}
pure int foo(const(int)[] x)
{
auto x2 = x.dup;
reverse(x2);
// do some calculation on x2
...
return calculation;
}
Hopefully you can see how foo still is pure, while being able to call
reverse. Essentially, weakly-pure functions can be used to build
strongly-pure functions.
This isn't what I was talking about - you didn't modify the contents of the
array x[].