Nested functions should be exempt from sequential visibility rules

Timon Gehr timon.gehr at gmx.ch
Tue Apr 3 05:12:51 PDT 2012


On 04/03/2012 02:00 PM, Nick Sabalausky wrote:
> "Timon Gehr"<timon.gehr at gmx.ch>  wrote in message
> news:jlej27$mvi$1 at 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()  { ... }
>> }
>>
>
> That's a very simple workaround (albiet unintuitive - unless I'm just too
> tired right now). It leads me to two questions:
>
> 1. How the heck does that work?
>

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

> 2. What, if any, problems would arise from just automatically doing that
> behind-the-scenes? Ie, to just automatically turn all non-templated nested
> functions into no-parameter templated nested functions? Would that be a
> feasable solution?
>
>

Your proposal is basically to allow a local function to forward 
reference any symbol that is declared before the local function is first 
referenced.

This still has the following problem:

void a(){/*cannot reference c*/}
void b(){/*because this references a*/}
void c(){/*references a and b*/ }

It would work by reordering the code like so:

void b(){/*references a*/}
void a(){/*references c*/}
void c(){/*references a and c*/}

That would be extremely unintuitive.


More information about the Digitalmars-d mailing list