Is This a Bug
Jonathan M Davis
jmdavisProg at gmx.com
Tue Oct 25 11:41:11 PDT 2011
On Tuesday, October 25, 2011 10:34 Gor Gyolchanyan wrote:
> I thought pure functions can't modify their parameters (along with any
> other non-local variables).
> if the pure function can't modify anything non-local, why should it
> care whether it's getting called from a shared context or not?
No. The _only_ direct effects that pure has on a function is that it can't
access any module-level or static variables which can ever be mutated over the
course of the program (so, if they're immutable or if they're const value
types, then they can be used, but otherwise not) and that it can't call impure
functions. Previously, it was required that all of the parameters to a pure
function be either immutable or implicitly convertible to immutable (and I
believe that that's what TDPL states), which would make it impossible to alter
the function's arguments, but the result was that pure was too restrictive to
be of much use. So, it was changed.
Now, any function which doesn't access any module-level or static variables
which can be modified during the course of the program and which doesn't call
any impure functions can be pure, but unlike before, purity is not enough for
a function call to be optimized out when it's called multiple times within an
expression. It can only be optimized out when the compiler can guarantee that
none of the function's arguments can be altered by that pure function, which
currently means that only functions whose arguments are all either immutable
or implicitly convertible to immutable can be optimized in that manner - just
like it was before. However, this makes it possible to have far more functions
be pure, so pure functions which do have parameters which are immutable or
implicitly convertible to immutable can call many more functions and do much
more. Being able to optimize out based on purity is therefore purely a
compiler optimization which it does when it can instead of always applying
to pure functions.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list