This is a little insane, but it works.

int Recurse(int a)
{
   if (a <= 1)
      return 1;
   else
   // can we replace explicit call to "Recurse"
   // with "self" using a mixin or some other means?
   //   return a * Recurse(a - 1);
mixin("return a * mixin(__traits(identifier, __traits(parent, {})))(a - 1);");
}

--rt

On Tuesday, 25 September 2012 at 04:42:43 UTC, Rob T wrote:
On Sunday, 23 September 2012 at 17:15:13 UTC, Ben Davis wrote:
Here's another one that might work, and be less error-prone:

mixin template Self() {
 auto self = __traits(identifier, __traits(parent, {}));
}

void test() {
 mixin Self;
 writeln(self);
}


OK, we've managed to get the calling function symbol name without re-specifying it. Now I wonder if we can perform mixin magic to execute a function recursively without re-specifying the function name?

Example recursive function

int Recurse(int a)
{
   if (a <= 1)
      return 1;
   else
   // can we replace explicit call to "Recurse"
   // with "self" using a mixin or some other means?
      return a * Recurse(a - 1);
}


We could try and get the function pointer, but that seems like the wrong approach. I'd rather get the function name, do some mixin magic with it to generate the compile time code that uses the function name directly. Can we mixin a mixin???

--rt


Reply via email to