digitalmars.D - Experiments with weak purity for the win, outer
- bearophile (28/28) Oct 26 2010 The weak purity is big. With DMD 2.050 many Phobos functions will be abl...
The weak purity is big. With DMD 2.050 many Phobos functions will be able to
support the pure attribute.
This is just a little example, swap:
http://d.puremagic.com/issues/show_bug.cgi?id=5121
A more complex example, sort, with the problems I've found (using 2.050alpha):
http://d.puremagic.com/issues/show_bug.cgi?id=5124
One of the troubles I've found is with "auto pure" nested functions, this
asserts:
// see http://d.puremagic.com/issues/show_bug.cgi?id=5006
import std.traits: FunctionAttribute, functionAttributes;
void main() {
static pure int foo1(int x) { return x; }
pure int foo2(int x) { return x; }
static assert(functionAttributes!(foo1) & FunctionAttribute.PURE); //
asserts
static assert(functionAttributes!(foo2) & FunctionAttribute.PURE); //
asserts
}
Weak pure functions may become so common in my code that I'd like them to be
weak pure on default :-) I know that because of C compatibility this is not an
acceptable change in D.
Another step forward may come from an outer attribute, that allows to put a
final stop to the unruly usage of globals (outer) variables as done in C (Spark
language already has something similar, and its usage is obligatory. In D the
outer is meant to be optional):
int x = 100;
int y = 200;
outer(in x, inout y)
int foo(int z) {
y = x + z;
return y;
}
The usage of #outer is optional, but if you use it then all constraints implied
you see in that code are enforced. See for more info:
http://d.puremagic.com/issues/show_bug.cgi?id=5007
Eventually it will become useful to have a way to apply or not apply the pure
attribute to a function according to a compile-time test, so a function
template may become pure or not according to the kind of template arguments it
receives.
Bye,
bearophile
Oct 26 2010








bearophile <bearophileHUGS lycos.com>