compile-time variables?

Bill Baxter dnewsgroup at billbaxter.com
Wed May 23 12:34:13 PDT 2007


Pragma wrote:
> Fraser wrote:
>> Thanks for the ideas! Unfortunately, it doesn't seem to be working 
>> (either way). Here's the complete code I tried:
>>
>> --------------------
>> import tango.io.Stdout;
>>
>> char[] ctfe_itoa(uint value)
>> {
>>     if (value < 10) return "0123456789"[value .. value+1];
>>     return ctfe_itoa(value / 10) ~ ctfe_itoa(value % 10);
>> }
>>
>> uint Counter(){
>>     return 1;
>> }
>>
>> uint Counter(in uint value){
>>     return value+1;
>> }
>>
>> uint nextID()
>> {
>>     const auto first = Counter();
>>     const auto second = Counter(first);
>>     const auto third = Counter(second);
>>     return third;
>> }
>>
>> template Foo(char[] name)
>> {        const char[] text = "const char[] " ~ name ~ " = \"Name: " ~ 
>> name ~ ", ID: " ~ ctfe_itoa(nextID()) ~ "\n\";";
>> }
>>
>> mixin(Foo!("a").text);
>> mixin(Foo!("b").text);
>> mixin(Foo!("c").text);
>> mixin(Foo!("d").text);
>> mixin(Foo!("e").text);
>> mixin(Foo!("f").text);
>>
>> int main(char[][] args)
>> {
>>     Stdout(a)(b)(c)(d)(e)(f);
>>     return 0;
>> }
>> --------------------
>>
>> The result was:
>> Name: a, ID: 3
>> Name: b, ID: 3
>> Name: c, ID: 3
>> Name: d, ID: 3
>> Name: e, ID: 3
>> Name: f, ID: 3
>>
>> A similar thing happened with the template example.
> 
> You need to prime your sequence with the zero counter value, and then 
> keep passing a template instance around to continue to count up:
> 
> template StartCounter(){
>     const uint next = 0;
> }
> 
> template Foo(char[] name,alias counter)
> {
>     const char[] text = "const char[] " ~ name ~ " = \"Name: " ~ name ~ 
> ", ID: " ~ ctfe_itoa(counter.next) ~ "\n\";";
>     const uint next = counter.next + 1;
> }
> 
> alias Foo!("a",StartCounter!()) foo_a;
> alias Foo!("b",foo_a) foo_b;
> alias Foo!("c",foo_b) foo_c;
> alias Foo!("d",foo_c) foo_d; // <-- note how we feed the previous 
> template back into the next template instance
> alias Foo!("e",foo_d) foo_e;
> 
> mixin(foo_a.text);
> mixin(foo_b.text);
> mixin(foo_c.text);
> mixin(foo_d.text);
> mixin(foo_e.text);
> 

The problem with that (I'm assuming) is that if he could arrange it so 
that the generated code contained a nice ordered sequence of template 
names in increasing order, then that means he could also just as easily 
generate IDs themselves without going through all the template hoops.

--bb



More information about the Digitalmars-d mailing list