Interesting GCC extensions

Lutger lutger.blijdestijn at gmail.com
Mon Sep 28 15:23:36 PDT 2009


bearophile wrote:

> Lutger:
> 
>> We don't need an extension for this! Look:
>> 
>> template Eval(string exp)
>> {
>>     enum Eval = mixin(exp);
>> }
>> 
>> template IsConstant(string exp)
>> {
>>     enum IsConstant = __traits(compiles, Eval!exp);
>> }
> 
> 
> From what I see I think your code is useless for my purposes:
> 
> // D2 code
> import std.stdio: writeln;
> 
> template Eval(string exp) {
>     enum Eval = mixin(exp);
> }
> 
> template IsConstant(string exp) {
>     enum IsConstant = __traits(compiles, Eval!exp);
> }
> 
> template Tuple(T...) { alias T Tuple; }
> 
> template Range(int stop) {
>     static if (stop <= 0)
>         alias Tuple!() Range;
>     else
>         alias Tuple!(Range!(stop-1), stop-1) Range;
> }
> 
> long ipow(long x, int n) {
>     long result = 1;
> 
>     static if (IsConstant!("n")) {
>         pragma(msg, "constant");
>         static if (n < 5) {
>             foreach (i; Range!(n))
>                 result *= x;
>         } else {
>             for (int i; i < n; i++)
>                 result *= x;
>         }
>     } else {
>         pragma(msg, "not constant");
>         for (int i; i < n; i++)
>             result *= x;
>     }
> 
>     return result;
> }
> 
> enum int w = 5;
> void main() {
>     int x = 2;
>     const int y = 3;
>     enum int z = 4;
>     writeln(IsConstant!("x"), " ", IsConstant!("y"),
>             " ", IsConstant!("z"), " ", IsConstant!("w"));
>     // prints: false false false true
> 
>     ipow(10, x);
>     ipow(10, y);
>     ipow(10, z);
> }
> 
> Even "z" is seen as not constant?
> 
> Bye,
> bearophile

They are not compile time constants. Have you tried it with GCC? It gives 
the exact same results.




More information about the Digitalmars-d mailing list