On 2011-07-06 15:02, Walter Bright wrote: > On 7/6/2011 2:12 PM, David Simcha wrote: > > On Wed, Jul 6, 2011 at 5:09 PM, Walter Bright <[email protected] > > > > <mailto:[email protected]>> wrote: > > This is what I have difficulty with. Consider: > > pure void foo(int* p) { *p = 3; } > > > > That isn't pure, or weakly pure. > > > > ???? Yes it is. It can be called from a strongly pure function without > > violating purity > > Yes, but it is not pure itself.
Yes it is. It's weakly pure. Sure, it can't be optimized out on its own, but no weakly pure function can be. It's pure because it does not directly access any global or static variables which can be mutated. Sure, p _could_ be passed a global or static variable, but it doesn't have to be, and it's guaranteed that it isn't when it's called from a strongly pure function (or is in the call chain of a strongly pure function). With weak purity, all that pure really means is that if the function is in the call chain of a strongly pure function, it cannot access a global or static variable which can be mutated and that it calls no functions which are not themselves pure. It's only when a function is strongly pure that optimizability and the more traditional meaning of purity comes in. A weakly pure function is a function that when called from a strongly pure will not violate the purity of the strongly pure function. foo would not violate the purity of any strongly pure function which called it. And all weakly and strongly pure functions are pure in that they're marked with the pure modifier (or have it implicitly due to inference by the compiler). So, yes foo _is_ pure. It's _weakly_ pure, but it's pure. - Jonathan M Davis _______________________________________________ dmd-beta mailing list [email protected] http://lists.puremagic.com/mailman/listinfo/dmd-beta
