Simen Kjaeraas wrote:
On Mon, 22 Aug 2011 22:19:50 +0200, Don <nos...@nospam.com> wrote:
BTW: The whole "weak pure"/"strong pure" naming was just something I
came up with, to convince Walter to relax the purity rules. I'd rather
those names disappeared, they aren't very helpful.
The concepts are useful, but better names might be worth it. But what
short word eloquently conveys 'accesses no mutable global state'? :p
@nostatic ?
stateless ?
What we call strongly pure is what in other languages is simply called
'pure', and that is likely the word that should be used for it.
Weakly pure is a somewhat different beast, and the 'best' solution would
likely be for it to be the default (But as we all know, this would
require changing the language too much. Perhaps in D3...). Noglobal
might be the best we have. My favorite thus far is 'conditionally pure'.
It conveys that the function is pure in certain circumstances, and not
in others. However, it might be somewhat diluted by the addition of pure
inference in newer versions of DMD - that definitely is conditionally
pure.
Const pure is not a concept I'm particularly familiar with. Is this the
special case of calling a conditionally pure function with only
const/immutable parameters, with arguments that are immutable in the
calling context, and that it in those cases can be considered
strongly pure?
No, it's where the signature contains const parameters, rather than
immutable ones.
Two calls to a const-pure function, with the same parameters, may give
different results. You'd need to do a deep inspection of the parameters,
to see if they changed.
Consider:
x = foo(y);
x = foo(y);
where foo is const-pure.
Perhaps y contains a pointer to x. In that case, foo could depend on x.
Or, there might be a mutable pointer to y somewhere, and x might have an
opAssign which modifies y.
In each case, the second y is different to the first one.
But, if foo is immutable-pure, it will return the same value both times,
so one of the calls can be optimized away.