On Monday, 19 August 2013 at 04:37:58 UTC, captaindet wrote:
On 2013-08-17 21:54, JS wrote:
On Sunday, 18 August 2013 at 00:17:22 UTC, captaindet wrote:
On 2013-08-17 14:36, Jesse Phillips wrote:
Third you've declared a variable, bar, which will store your
enumerated value, 4. Variables are not compile time, even if the
value stored came from a compile time known value.

yep, it completely escaped me that these are 'normal' variables. and i have realized now that i can make them known at compile time the same way as is done for other 'normal' variables, by declaring
them const ;)


But if they are const then what good does that do you? Just use an
alias or enum in the first place?

to be honest, i have not found a use case ;)

highest priority was that i understood what was going on here...

how did i get there? i was looking for an easy way to get pragma(msg,...) to print the given name for an enumerated value. in this example test2 or test4 instead of 2 and 4 - just like write is doing it at runtime. so i was playing around with the different variants of enum to see if i could get it working somehow.. and got sidetracked....

in the end i stuck to manifest constant enums storing the enumerated values and found that

pragma( msg, to!string(foo) );

is doing the trick.


/det

I had the same issues, it is not an issue with logic but with the weird way dmd works(pragma is handled very early on and before ctfe's are completely parsed).

Remember you can use ctfe's to format strings any way you want and even do logic and other stuff but you can't use pragma's inside the ctfe on ctfe variables(because as far as pragma is concerned, they are run time at that point).



module main;

import std.stdio, std.conv;

template foo(alias T)
{
    string foo(string s)
    {
                string x = to!string(T) ~ s ~ "yyyy";
//pragma(msg, x); // pragma see's x as a run time variable(or rather pragma is executed before x is truly defined)
                return x;
    }
}
int main(string[] argv)
{

pragma(msg, foo!("asf")("xxx")); // note, it prints what the commented pragma is suppose to print, but this one works!!! Because it is outside the ctfe and foo!(...) can be computed at compile time
        readln();
        return 0;
}

I really believe the issue is with the compiler and is a bug. Somehow x gets marked as run time, probably because ctfe's are suppose to work at run time too... even though in this instance it is being used at compile time. (so it should work)

Reply via email to