Pre-conditions at compile-time with static arguments
KennyTM~
kennytm at gmail.com
Mon Apr 25 14:42:58 PDT 2011
On Apr 26, 11 03:44, bearophile wrote:
> Given that pre-conditions are meant to run fast and to be (nearly) pure, this is my idea: when you call a function with all arguments known at compile time (as at the r3 variable) the compiler runs just the pre-condition of that function at compile-time (and not its body and post-condition).
>
> The advantage is some bugs are caught at compile-time, and the compiler is kept simple (I'd like contracts to be verified statically in more situations, but this requires a more complex compiler). The disadvantage is longer compilation times, and troubles caused by pre-conditions that can't really run at compile-time (like a precondion that uses a compiler intrinsic). A way to solve this last problem is to not raise an error if a pre-condition can't run at compile-time, and just ignore it, and let it later run normally at run-time.
>
> The variable r2 is a situation where not all arguments of foo() are known at compile-time, so here the foo pre-condition is not run.
>
>
> (Note: the variable r2 is a situation where one argument of foo is known at run-time, and in this case the pre-condition contains a part (assert(x>=0&&x<text.length)) that's able to use this information to catch a bug. This is a possible improvement of the idea is to perform this partial test. This looks less easy to implement, so it's not important).
>
> Bye,
> bearophile
I feel this isn't right. The input or the precondition is very often not
compile-time evaluable, thus it just won't run. An example grabbed from
my code near by:
foreach (key; keys) // <-- keys is usually not known at
compile time
assert(key !in _map); // <-- 'in' is not CTFE-able (yet).
Also, if the precondition were complaining, and you change some bit of
the code and find it can be compiled -- that won't mean anything, as it
is likely the change just make the precondition non-CTFE-able. The
benefit doesn't worth the cost.
(And this is yet another kind of 0% false-positive-rate, non-zero
false-negative-rate feature. I bet you'll get a "false sense of
security" response. Personally I'd rather have the compiler to catch 50%
of compile-time detectable errors than leaving 100% of them to run time.)
I also don't believe this still keeps the compiler simple, as now there
are 2 kinds of CTFE error the compiler needs to distinguish: assert
errors and non-assert errors. I don't know much about the compiler
intrinsic, and actually the D front-end is already very complicated :),
so this doesn't matter.
More information about the Digitalmars-d
mailing list