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