nested enum like template generator

Ali Çehreli acehreli at yahoo.com
Tue Jul 16 07:05:38 PDT 2013


On 07/15/2013 10:51 PM, JS wrote:

 > On Tuesday, 16 July 2013 at 04:37:33 UTC, Ali Çehreli wrote:
 >> On 07/15/2013 08:43 PM, JS wrote:
 >>
 >> > http://dpaste.dzfl.pl/7c8b0ba9
 >> >
 >> > Why the heck can't we use integers in ctfe's? There seems to
 >> be no
 >> > simple way to create a counter and this is one of the most
 >> basic
 >> > programming constructs to use.. yet with ctfe's it's
 >> impossible.
 >> >
 >> > I'd like each variable in the nested structs to be
 >> incremented properly.
 >>
 >> I did not read the code but just from your description, the separate
 >> compilation model that D uses would preclude that. For example,
 >> compilation of a.d would not know anything about the counter that b.d
 >> has counted during its compilation.
 >>
 >> Ali
 >
 > Huh? what is a.d and b.d?

Yeah, I should have read your code before writing that. My comment is 
for the general case where a.d and b.d are two separte modules that are 
compiler separately. I thought that you wanted a counter to continue 
counting between modules.

 > The template transforms a string into a D code string... which is then
 > string mixed in. The counter and code generation have nothing to do with
 > the result. A counter is needed in the generation of the code to
 > generate enum like characteristics.
 >
 > It does use recursion, and I could pass a variable that counts the
 > number of elements but this too would probably not work due to D
 > bitching about using ints.

I must still be in the dark but I seriously doubt that you would have 
problems incrementing an int in D.

 > I imagine one could hack D to make it's flawed CTFE system work, to some
 > degree... like using strings:
 >
 >
 > template inc(string s)
 > {
 >      string _(string a)
 >      {
 >          if (a == "0") return "1";
 >          if (a == "1") return "2";
 >          if (a == "2") return "3";
 >          if (a == "3") return "4";
 >          return "0";
 >      }
 >      enum inc = _(s); pragma(msg, ":"~_(s));
 > }
 >
 > which is a modulo 4 incrementer. So, CTFE's have the ability to count...
 > but extremely short sighted that they don't. I imagine can write a whole
 > template library using strings to emulate ints in ctfe's... what a shame
 > though...

That would be extreme.

Ali



More information about the Digitalmars-d-learn mailing list