Re: Scope of import

2021-05-15 Thread DLearner via Digitalmars-d-learn
On Saturday, 15 May 2021 at 11:38:22 UTC, Adam D. Ruppe wrote> 
Just use

```

dmd -i main.d

instead. It will be about 2x faster and more reliable.

```

Your suggestion worked.
Thank you.




Re: Scope of import

2021-05-15 Thread Alain De Vos via Digitalmars-d-learn

In unix i give the compiler:
```
ldc2 `find . -name \*.d -print`
```
So he always takes all sourcefiles


Re: Scope of import

2021-05-15 Thread Adam D. Ruppe via Digitalmars-d-learn

On Saturday, 15 May 2021 at 11:46:49 UTC, Dennis wrote:

You can do `dmd -i -run main.d`


Yeah but that's weird with how it handles arguments and without 
the compilation cache it gets really annoying to use.


Re: Scope of import

2021-05-15 Thread Dennis via Digitalmars-d-learn

On Saturday, 15 May 2021 at 11:38:22 UTC, Adam D. Ruppe wrote:
* rdmd runs the program too, dmd -i just compiles. You run the 
program separately.


You can do `dmd -i -run main.d`


Re: Scope of import

2021-05-15 Thread Adam D. Ruppe via Digitalmars-d-learn

On Saturday, 15 May 2021 at 07:15:51 UTC, DLearner wrote:

rdmd main.d


rdmd sucks, it runs the compiler twice and get the list of 
imports and even then it might not see them all.


Just use

dmd -i main.d

instead. It will be about 2x faster and more reliable.

The downside differences though:

* rdmd runs the program too, dmd -i just compiles. You run the 
program separately.
* rdmd will cache the executable, dmd -i will always recompile. 
But since running the program is a separate step, you just run it 
yourself if you don't want to recompile, and run dmd if you do.




Re: Scope of import

2021-05-15 Thread Mike Parker via Digitalmars-d-learn

On Saturday, 15 May 2021 at 07:15:51 UTC, DLearner wrote:

On Saturday, 15 May 2021 at 07:05:00 UTC, Mike Parker wrote:


That's odd. What's your command line?


rdmd main.d


Okay, so it's definitely a bug in rdmd. Change module A to look 
like this and it works properly:


```d
module A;

import B;

void fnA1() {

   import std.stdio;

   writeln("Entered fnA1");
   fnB1();
   writeln("Leaving fnA1");
}
```


Re: Scope of import

2021-05-15 Thread DLearner via Digitalmars-d-learn

On Saturday, 15 May 2021 at 07:19:08 UTC, Mike Parker wrote:

Then it must be an issue with rdmd...



rdmd build 20210311
Running under Win-10.







Re: Scope of import

2021-05-15 Thread DLearner via Digitalmars-d-learn

On Saturday, 15 May 2021 at 07:05:00 UTC, Mike Parker wrote:


That's odd. What's your command line?


rdmd main.d


Re: Scope of import

2021-05-15 Thread Mike Parker via Digitalmars-d-learn

On Saturday, 15 May 2021 at 07:15:51 UTC, DLearner wrote:

On Saturday, 15 May 2021 at 07:05:00 UTC, Mike Parker wrote:


That's odd. What's your command line?


rdmd main.d


Then it must be an issue with rdmd. The following both work as 
expected, whether your the `import B;` in `main` is commented out 
or not:


dmd -i main.d
dmd main.d A.d B.d


Re: Scope of import

2021-05-15 Thread Mike Parker via Digitalmars-d-learn

On Saturday, 15 May 2021 at 06:55:47 UTC, DLearner wrote:

1. Code above compiles but fails on linker step with 'Error 42 
Symbol Undefined'.
To me, unexpected behaviour as imports arranged to pick up 
symbols (with minimum scope).


Your error is a linker error. Imports have nothing to do with the 
linker. They are for the compiler to know which symbols are 
available in the module it's currently compiling. But every 
symbol that you use needs to be linked by the linker, and that's 
a separate step.




2. Uncommenting the 'import B' in main everything works 
correctly.


That's odd. What's your command line?

To me, particularly unexpected behaviour as no symbol from B 
directly used in main (also undesirable to set scope 
unnecessarily wide).




Whether you use a symbol in main or not is irrelevant to the 
linker. Any symbol accessed anywhere in your program must 
ultimately be linked in.




Scope of import

2021-05-15 Thread DLearner via Digitalmars-d-learn

```
// main
void main() {
   import A;
// import B;
   import std.stdio;

   writeln("Entered main");

   fnA1();

   writeln("Leaving main");
}
```

```
module A;

void fnA1() {

   import B;
   import std.stdio;

   writeln("Entered fnA1");
   fnB1();
   writeln("Leaving fnA1");
}
```

```
module B;

void fnB1() {

   import std.stdio;

   writeln("Entered fnB1");
   writeln("Leaving fnB1");
}
```

1. Code above compiles but fails on linker step with 'Error 42 
Symbol Undefined'.
To me, unexpected behaviour as imports arranged to pick up 
symbols (with minimum scope).


2. Uncommenting the 'import B' in main everything works correctly.
To me, particularly unexpected behaviour as no symbol from B 
directly used in main (also undesirable to set scope 
unnecessarily wide).


Best regards