[dmd-beta] beta 2
Jonathan M Davis
jmdavisProg at gmx.com
Wed Jul 6 15:14:12 PDT 2011
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 <walter at digitalmars.com
> >
> > <mailto:walter at digitalmars.com>> 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
More information about the dmd-beta
mailing list