On Thursday, 15 May 2014 at 10:46:21 UTC, Ola Fosheim Grøstad
wrote:
On Thursday, 15 May 2014 at 09:45:52 UTC, Don wrote:
But it turns out that @memoizable isn't actually an
interesting property, whereas '@noglobal' is.
"No global state" is a deep, transitive property of a
function. "Memoizable" is a superficial supersetextra property
which the compiler can trivially determine from @noglobal.
Uhm. That is a pretty strong assumption. "memoizable" is very
useful property when you do multihreading, transactions or
anything that requires locking.
It's useful, but it's not a deep property, and importantly, it
isn't transient. The compiler can trivially work it out if it
knows the function is @noglobal.
And you can still access globals, you just need a guarantee
that globals don't change until you are done.
Sure, but how can the compiler statically check that? It's a
tough problem.
(That's not a rhetorical question, BTW. If you have a solution,
that would be awesome).
Considering that > 90% of the functions I write don't do IO or
globals I'd rather specify the opposite. "io", "global"
whatever. That is also easy to enforce, i.e. you don't get to
access IO/globals if you don't annotate the function.
I agree, I'd personally like to have an annotation '@global', and
put 'pure:' at the top of every module.