Re: Is it possible to disallow import for certain functions?

2019-07-27 Thread Jonathan M Davis via Digitalmars-d-learn
On Saturday, July 27, 2019 7:12:32 AM MDT evilrat via Digitalmars-d-learn 
wrote:
> On Saturday, 27 July 2019 at 12:48:12 UTC, BoQsc wrote:
> > I seem to be doing something wrong, the result is the same.
> >
> >> otherFile.d(8): Error: only one main, WinMain, or DllMain
> >> allowed. Previously found main at mainFile.d(11)
> >>
> >>private version = otherMain;
> >>version(otherMain) {
> >>
> >>void main(){
> >>
> >>writeln("Interesting");
> >>
> >>}
> >>
> >>}
>
> Of course. When you import that module "version = ..." is likely
> still evaluated and it enables that second main. Either move it
> to yet another module(and that's just masks the problem) or use
> command-line parameter to toggle which one to use.

You can't declare a version identifier within a module and have them affect
other modules. Only built-in version identifiers and those passed to the
compiler can affect multiple modules.

I don't know what the OP is really trying to do, but in general, it makes no
sense to have multiple mains. Pretty much the only time that I'd even
consider it would be with version(unittest) so that the normal main isn't
run when compiling and running unit tests. If code is going to be used
across multiple projects (and thus need multiple mains), I'd have the shared
code in a library, with the code including the different mains being
completely separate - probably even in completely separate repos, since
they'd be for different programs.

- Jonathan M Davis





Re: struct is not copyable because it is annotated with @disable bugs ?

2019-07-27 Thread Newbie2019 via Digitalmars-d-learn

On Saturday, 27 July 2019 at 17:13:45 UTC, Adam D. Ruppe wrote:
If you change that to just plain `return NodeList(a, b);`, 
while keeping the first line, it will compile too.


The reason here is when you return and construct together, it 
constructs it in-place. But if you put it in a local variable 
first, it needs to copy it to the return value.


Removing the first line just lets the compiler optimize out the 
local variable, reducing it to the in-place one again.


But explicitly returning and constructing together works in 
either case.


Thanks your for the very quick and good explain.

I thinks the DMD should report a more helpful error about this.


Re: struct is not copyable because it is annotated with @disable bugs ?

2019-07-27 Thread Adam D. Ruppe via Digitalmars-d-learn

On Saturday, 27 July 2019 at 16:59:44 UTC, Newbie2019 wrote:

auto list = NodeList(a, b);


If you change that to just plain `return NodeList(a, b);`, while 
keeping the first line, it will compile too.


The reason here is when you return and construct together, it 
constructs it in-place. But if you put it in a local variable 
first, it needs to copy it to the return value.


Removing the first line just lets the compiler optimize out the 
local variable, reducing it to the in-place one again.


But explicitly returning and constructing together works in 
either case.


struct is not copyable because it is annotated with @disable bugs ?

2019-07-27 Thread Newbie2019 via Digitalmars-d-learn



I think this is a bug.

If I return a struct more than one times,  will throw this error.
If I return once,  every thing is ok.

https://run.dlang.io/is/T4kWKM


ref auto getList() return scope {
		if( i ) return NodeList(null); // remove this line will fix 
this error

A* a;
B* b;
auto list = NodeList(a, b);
return list;
}


Re: Is it possible to disallow import for certain functions?

2019-07-27 Thread XavierAP via Digitalmars-d-learn

On Saturday, 27 July 2019 at 11:54:09 UTC, BoQsc wrote:
I would like to make sure that function in module that I have 
won't be imported, is this possible to achieve?


In general, make the function private.

But indeed, on your case, it is a terrible idea to define a 
main() function in a module that you plan to import. Move it out 
into its own main module.


Is it possible to disallow import for certain functions?

2019-07-27 Thread BoQsc via Digitalmars-d-learn
I would like to make sure that function in module that I have 
won't be imported, is this possible to achieve?


Test subject:


mainFile.d

import otherFile;
void main(){

}


otherFile.d

import std.stdio : writeln;
import std.file  : mkdir;

int main(){
writeln("test ");
return 0;
}



Error, main() method has been imported:
how to disallow main() method from being imported?
otherFile.d(5): Error: only one main, WinMain, or DllMain 
allowed. Previously found main at mainFile.d(3)