Pre-conditions at compile-time with static arguments

so so at so.so
Mon Apr 25 13:33:17 PDT 2011


On Mon, 25 Apr 2011 22:44:07 +0300, bearophile <bearophileHUGS at lycos.com>  
wrote:

> This is a possible enhancement request for DMD. I am not sure about the  
> consequences of this, so this is currently not in Bugzilla, I look for  
> opinions.
>
> DMD currently runs functions at compile time only if their call is in a  
> context where a compile-time value is expected, to avoid troubles. C++0X  
> uses a keyword to avoid those problems.

constexpr double pi = 3; // C++
enum double pi = 3; // D

constexpr double fun() { return 3; } // C++
double fun() { return 3; } // D

For variable declaration, exact same thing.
For functions, i am not exactly sure the need for a keyword and i think  
the D way is simply beautiful and truly generic.
One reason i could think of is for library development, you sometimes want  
to be sure that a function "could be" executed at compile-time. In C++  
there is no such thing i am aware of, in D we got unittesting.

> [-----------------
>
> Little box:
>
> Time ago I have heard that "enum" is useless and const/immutable  
> suffice. So if "enum" gets removed from D how do you tell apart the  
> desire to run a function (not a global call) at compile time from the  
> desire to run it at run time and assign its result to a run-time  
> constant value?
>
> int bar(int x) {
>     return x;
> }
> void main() {
>     enum b1 = bar(10); // runs at compile-time
>     const b2 = bar(20); // doesn't run at compile-time
> }

Another question is why would the left hand side of "=" even matter? What  
is wrong with executing the function(constant) pair always at compile-time  
(if it could be executed that is)? Only reason using "enum, static,  
immutable" over "auto" should be "making sure" it runs at compile-time  
(again, if it can).

Obviously we know the reasons for the desire for compile-time execution,  
is there any reason at all for runtime?


More information about the Digitalmars-d mailing list