compile-time variables?

Fraser fraserofthenight at gmail.com
Wed May 23 17:15:49 PDT 2007


Thanks. Yeah, that seems to work, but Bill is right - generating the IDs is probably simpler than trying to ensure I keep a reference to the template each time. Since it might need to go between multiple files, I think I'm probably going to have to look for a runtime solution, anyway. Thanks for your help.

Pragma Wrote:

> Bill Baxter wrote:
> > 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
> 
> Possibly.  It all depends on the complexity of his solution - the trivial example above doesn't do it much justice. 
> Where this really comes in handy is when you need to repeat any such block of declarations:
> 
> template Foo!(alias counter){
> 	alias Foo!("a",StartCounter!()) foo_a;
> 	alias Foo!("b",foo_a) foo_b;
> 	alias Foo!("c",foo_b) foo_c;
> 
> 	mixin(foo_a.text);
> 	mixin(foo_b.text);
> 	mixin(foo_c.text);
> 
> 	alias foo_c.next next; // save the counter state for the next use
> }
> 
> alias Foo!(StartCounter!()) foo1;
> alias Foo!(foo1) foo2;
> alias Foo!(foo2) foo3;
> 
> -- 
> - EricAnderton at yahoo




More information about the Digitalmars-d mailing list