Some pre-conditions at compile-time (reprise)
bearophile
bearophileHUGS at lycos.com
Mon Dec 24 03:09:34 PST 2012
Some time ago I have suggested the idea of running the
pre-conditions at compile-time where possible:
http://d.puremagic.com/issues/show_bug.cgi?id=5906
This helps turn some run-time errors in compile-time errors, when
the inputs are statically known. This is expecially handy for
literals of user-defined subtypes.
But Walter answered a problem:
> The user must make an explicit choice if code is to be run at
> compile
> time or run time.
They have just accepted the Ada 2012 standard, that among other
things (like the "old" (prestate) for contract programming)
introduces a "Static_Predicate" aspect (this page is not very
readable):
http://www.ada-auth.org/standards/12rm/html/RM-3-2-4.html
Static_Predicate allows to attach a compile-time predicate that
verifies the validity of a subtype (there is also
"Dynamic_Predicate").
So an idea to remove the problem found by Walter is to introduce
"static preconditions" in D (there is a "static" before the "in",
currently this code is a syntax error):
import std.ascii: isDigit;
struct Digit {
char d;
alias this = d;
this(in dchar c)
static in {
assert(isDigit(c));
} body {
// Currently this cast is necessary,
// despite the pre-condition.
d = cast(char)c;
}
}
void main() {
// Currently not allowed handy syntax:
// Digit[] d = ['5', '6'];
// Becomes a compile-time error:
Digit[] d = [Digit('5'), Digit('x')];
}
Adding "static" to a precondition means the compiler will try to
run the precondition at compile-time where possible, and at
run-time where it's not possible. (So a "static in" does not mean
the pre-condition will always run at compile-time).
If you don't add a "static" before "in" the precondition will be
run only at run time, as usual. This avoids the unwanted growth
of compilation times that Walter wants to avoid.
Bye,
bearophile
More information about the Digitalmars-d
mailing list