A question about purity

Steven Schveighoffer schveiguy at yahoo.com
Wed Sep 14 05:07:38 PDT 2011


On Tue, 13 Sep 2011 07:43:55 -0400, bearophile <bearophileHUGS at lycos.com>  
wrote:

> Jonathan M Davis:
>
>> However, Foo.y is not encapsulated
>> by a strongly pure function at all. Other functions can alter alter it.  
>> So, it
>> breaks purity.
>
> Thank you for your explanation :-)
>
> So, let's change the situation a bit. If the struct Foo is the only  
> thing present in a module (to avoid someone to touch its private  
> members), and the y field is "private static" only foo2 is able to touch  
> it. In this case isn't foo2 weakly pure?
>
>
> struct Foo {
>     private static int y;
>     static pure void foo2() {
>         Foo.y++;
>     }
> }
> void main() {}

weak purity vs. strong purity is determined by the parameters.   
Strong-pure functions must have all parameters immutable or implicitly  
convertable to immutable.

Since foo2 has no parameters, it will be classified as strong-pure.

Yet, pure optimizations cannot be used on it.  For example, for a  
strong-pure function fn, the following calls can be reduced to one call:

int i = fn();
int j = fn(); // can be rewritten to int i = j

But foo2 cannot be optimized this way, it would change the value of y.

What you want to do is consider the private static state of a class/struct  
to be part of the parameters to such functions, which I think negates a  
lot of possible optimizations, when those static variables are not used.   
It makes too broad an assumption.

Not to mention, static private variables are accessible from *any* member  
function, which means any member function of a class/struct which contains  
private static variables could not be strong-pure.

But the real killer: the side effect makes foo2 not composable into  
strong-pure functions.  That is, a strong pure function that calls a weak  
pure function *does not* become weak pure.  However, in this case, it  
would have to.  The whole system breaks down once you start implying  
global state is a parameter.

-Steve


More information about the Digitalmars-d-learn mailing list