On 03/04/12 07:38, Nick Sabalausky wrote:
Regarding this:

http://d.puremagic.com/issues/show_bug.cgi?id=790

I submit that nested functions should be exempt from the usual sequential
visibility rules. (Therefore, mutually recursive nested functions would
become possible.)

Or at the very *least*, this horrific C-like workaround should be possible:

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

...Flame away! ;)


This is asking for a complicated special case. In global scope, order of declarations doesn't matter. In function scope, order of declarations always matters.
If you have type inference of function returns, things can get nasty:

void foo()
{
     auto b() { return a(); }
     X x = whatever;
     auto a() { return x; }
}
Now b actually depends on the declaration of x. So it's not enough to say that only function declarations are immune to ordering rules. Furthermore, any declaration before x, which calls b(), is using x even though x hasn't been initialized (or even declared) yet. Suddenly all kinds of horrible situations become possible, which could never happen before.

In general, allowing forward references inside a function is far, far more difficult than in global scope. There are very many more special cases. Allowing it in global scope is quite complicated enough.

You can always use a delegate, if you want recursive nested functions.

Reply via email to