Thread overview
Forward reference to nested function not allowed?
May 31, 2014
DLearner
May 31, 2014
Adam D. Ruppe
May 31, 2014
Philippe Sigaud
Jun 02, 2014
Jonathan M Davis
May 31, 2014
Hi,

import std.stdio;
void main() {

   writefln("Entered");

   sub1();
   sub1();
   sub1();

   writefln("Returning");

   void sub1() {
      static int i2 = 6;

      i2 = i2 + 1;
      writefln("%s",i2);
   };
}

does not compile, but

import std.stdio;
void main() {
   void sub1() {
      static int i2 = 6;

      i2 = i2 + 1;
      writefln("%s",i2);
   };
   writefln("Entered");

   sub1();
   sub1();
   sub1();

   writefln("Returning");


}

compiles and runs as expected.

Is this intended?
May 31, 2014
On Saturday, 31 May 2014 at 16:18:35 UTC, DLearner wrote:
> Is this intended?

Yes, nested functions access local variables and thus follow the same order of declaration rules as they do; you can't use a local variable before it is declared so same with a nested function.
May 31, 2014
See:  http://dlang.org/function.html#variadicnested

The second example explains that nested functions can be accessed only if the name is in scope.
June 02, 2014
On Sat, 31 May 2014 16:18:33 +0000
DLearner via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
wrote:

> Hi,
>
> import std.stdio;
> void main() {
>
>     writefln("Entered");
>
>     sub1();
>     sub1();
>     sub1();
>
>     writefln("Returning");
>
>     void sub1() {
>        static int i2 = 6;
>
>        i2 = i2 + 1;
>        writefln("%s",i2);
>     };
> }
>
> does not compile, but
>
> import std.stdio;
> void main() {
>     void sub1() {
>        static int i2 = 6;
>
>        i2 = i2 + 1;
>        writefln("%s",i2);
>     };
>     writefln("Entered");
>
>     sub1();
>     sub1();
>     sub1();
>
>     writefln("Returning");
>
>
> }
>
> compiles and runs as expected.
>
> Is this intended?

Currently, you cannot forward reference a nested function. Kenji was looking into it recently, so maybe we'll be able to at some point in the future, but right now, we definitely can't. But even if we can in the future, I'd expect that you'd have to declare a prototype for the function to be able to use it before it's declared. In general though, I think that the only reason that it would really be useful would be to have two nested functions refer to each other, since otherwise, you just declare the nested function earlier in the function.

- Jonathan M Davis