On 08/03/2013 09:07 PM, Meta wrote:
On Saturday, 3 August 2013 at 16:47:52 UTC, Timon Gehr wrote:
On 08/03/2013 05:59 PM, monarch_dodra wrote:
One last question: Pointers.
int get(int* p) pure
{
return *p;
}
void main()
{
int i = 0;
auto p = &i;
get(p);
}
Here, get, to me, is obviously not pure, since it depends on the state
of the global "i". *Where* did "get" go wrong? Did I simply "abusively"
mark get as pure? Is the "pure" keyword's guarantee simply "weak"?
...
Yes, it's weak.
It depends on whether you think a pointer dereference is pure or not (I
don't know the answer).
It is pure in D, but I guess you are not referring to that.
What's your understanding of purity in this context?
That aside, as long as get doesn't modify the
value at *p or change what p points to, this is strongly pure
Modification and dereference within a Haskell expression:
import Data.STRef
import Control.Monad.ST
x = runST $ do
x <- newSTRef 0
writeSTRef x 1
v <- readSTRef x
return v
main = print x
(i.e., the academic definition of purity).
I wouldn't go that far.