On Saturday 23 July 2011 11:28:07 Andrej Mitrovic wrote: > Ok, so pure does the job, didn't know.
There are two requirements for a function to be pure: 1. Any functions that it calls must be pure. 2. It cannot access any static or global variables unless they're immutable or they're const value types (essentially, they can't access any static or global variables which could ever be changed over the course of the program). So, if a function is pure, it can't access a global variable like in your example. Now, in addition to that, if a pure function's arguments can be determined to be guaranteed to be unchanged when the function is call, then that function is strongly pure, and additional calls to it with the same arguments in the same expression can be optimized out. At the moment, that means that the function's parameters must all either be immutable or implicitly convertible to mutable, but there are cases where the compiler could conceivably optimize it with just const (e.g. if an immutable variable is passed to a function where the parameter is const). So, the primary thing that you get out of pure in the general case (since so many functions can be weakly pure but not strongly pure) is that you have the guarantee that it doesn't access global variables whose state is at all mutable. - Jonathan M Davis