On Tuesday, 3 April 2012 at 12:13:00 UTC, Timon Gehr wrote:
On 04/03/2012 02:00 PM, Nick Sabalausky wrote:
"Timon Gehr"<timon.g...@gmx.ch>  wrote in message
news:jlej27$mvi$1...@digitalmars.com...

This is the right way to work around this issue. It works now and does not
imply any kind of overhead at runtime:

void foo(){
    void a()(){ ... }
    void b()  { ... }
}


1. How the heck does that work?


Symbol lookup is done upon the first instantiation of the local template.

Currently, it prints 365. But remove the commented line, and it prints 500 twice. But it's a minor issue at worst that's easy to avoid, and this is a very simple workaround.

int two()
{
        return 500;
}

void main()
{
        int x = 365;
        
        int one()()
        {
                return two();
        }
        
        // writeln(one());
        
        int two()
        {
                return x;
        }
        
        writeln(one());
}


I found another solution involving templates, though not as convenient:

template foo()
{
        int one(){
                return two();
        }
        
        int two(){
                return x + y;
        }
        
        int y = 12;
}

void main()
{
        int x = 365;
        mixin foo;
        writeln(one());
}

Reply via email to