www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Workaround for foreward declaration ?

reply "Peter Sommerfeld" <noreply rubrica.at> writes:
According to  http://dlang.org/ctod.html foreward declarations
are not needed because functions can be defined in any order.
But that seems not to be true for inner functions. A somewhat
artificial example:
-----------------------------
import std.stdio;

void main(string[] args){
     int count;
	
     // void foo() -- unlike in C in D not possible

     void bar(){
	++count;
         writeln("bar");

         foo(); // ERROR: undefined identifier foo
     }
	
     void foo(){
         writeln("foo");	
         if(count){
              writeln("foo again");
              return;
         }

         bar();
     }
	
     foo();
}
---------------------------------------

Is there a workaround for such a situation or do I have
to put everything outside the enclosing function.

Peter
Mar 03 2013
parent reply Jonathan M Davis <jmdavisProg gmx.com> writes:
On Sunday, March 03, 2013 15:39:38 Peter Sommerfeld wrote:
 According to  http://dlang.org/ctod.html foreward declarations
 are not needed because functions can be defined in any order.
 But that seems not to be true for inner functions. A somewhat
 artificial example:
 -----------------------------
 import std.stdio;
 
 void main(string[] args){
      int count;
 
      // void foo() -- unlike in C in D not possible
 
      void bar(){
 	++count;
          writeln("bar");
 
          foo(); // ERROR: undefined identifier foo
      }
 
      void foo(){
          writeln("foo");
          if(count){
               writeln("foo again");
               return;
          }
 
          bar();
      }
 
      foo();
 }
 ---------------------------------------
 
 Is there a workaround for such a situation or do I have
 to put everything outside the enclosing function.
AFAIK, you have to put them outside for this. The order of both function calls and import declarations matters inside of a function even though it doesn't matter outside. In general, nested functions are more limited (e.g. if they're templated, you can't instantiate them with different arguments - you only get one instantation). - Jonathan M Davis
Mar 03 2013
parent "Peter Sommerfeld" <noreply rubrica.at> writes:
Jonathan M Davis wrote:
 AFAIK, you have to put them outside for this. The order of both function  
 calls and import declarations matters inside of a function even though  
 it doesn't matter outside. In general, nested functions are more limited 
 (e.g. if   they're templated, you can't instantiate them with different
 arguments - you  only get one instantation).
Thanks David! Should be mentioned somewhere though. Well, probably is, somewhere ... Peter
Mar 03 2013