On Sun, 04 Jul 2010 00:43:50 +0000, BCS wrote: > Hello Mike, > >> I'm trying to compile the following file. Can somebody explain to me >> how I can rewrite it so that I don't get "Error: non-constant >> expression"? All I'm trying to do is create, using templates, a string >> of all characters between two given characters: >> >> > 1) where did you get that error? (I'm lazy, sorry) 2) is there a reason > you don't use CTFE? > > dchar[] Between(dchar start, dchar stop) { > if(start > stop) { auto t = start; start = stop; stop = t; } > > dchar[] ret; > for(dchar d = start; d<=stop; d++) ret ~= d; return ret; > } > > import std.stdio; > void Go(dchar[] s)(){writef("%s\n", s); } void > main(){Go!(Between('a','g'))();} > >> 1 module ua; >> 2 >> 3 template dcharInterval(immutable(dchar) start, immutable(dchar) stop) >> 4 { >> 5 static assert(stop >= start); >> 6 static if(start == stop) >> 7 dstring dcharInterval = [start]; 8 else >> 9 dstring dcharInterval = [start] ~ dcharInterval!(start + 1, >> stop); >> 10 } >> 11 >> 12 dstring LATIN = "\u00AA"d ~ "\u00BA"d ~ dcharInterval!(0x00C0, >> 0x00D6); >> 13 >> Thanks. >>
Hi BCS, 1. I was getting that error on lines 9 and 12. I got it a couple dozen times (I assume once for each template instance). 2. The reason I don't use CTFE is because I don't know how to be certain its been called at compile time. Apparently using a result in a template like you did will accomplish that, but is there a way I can be sure without making up bogus empty templates? Thanks. -- Mike Linford