On 14 June 2012 22:42, Oleg Endo wrote:
> On Thu, 2012-06-14 at 16:34 -0400, Rick C. Hodgin wrote:
>> David,
>>
>> Well, I probably don't have a NEED for it.  I've gotten along for 25+
>> years without it. :-)
>>
>> However, what prompted my inquiry is using it would've saved me tracking
>> down a few bugs in recent weeks.  Some prior code was re-used for a
>> similar function, but the name of the recursive calls weren't updated in
>> every case.  It didn't take long to debug, but I realized that had it
>> always been written as self() it never would've been an issue.
>>
>> I can also see a use for generated code where there's a base source code
>> template in use with an embedded include file reference that changes as
>> it's generated per pass, such as:
>>
>> int step1(int a, int b)
>> {
>>      #include "\current_task\step1.cpp"
>> }
>>
>> int step2(int a, int b)
>> {
>>      #include "\current_task\step2.cpp"
>> }
>>
>> Using the self() reference for recursion, one could modify stepN.cpp's
>> generator algorithms without having to know or care anything in the
>> wrapper code.
>
> Wouldn't this do?
>
> #define __self__ step1
> int __self__ (int a, int b)
> {
>  #include "something"
>  __self__ (x, y);
> }
> #undef __self__
You can already do this with GCC in C and C++ (minus problems with
overloaded functions) like this:

#define DECLSELF(f,self) __typeof__ (&f) self = f

int foo (int n)
{
    DECLSELF(foo, self);

    if (n == 0)
        return 0;
    else
    {
        return 1 + self (n - 1);
    }
}

-- 
VZ

Reply via email to