[Issue 3603] Allow selective import syntax to import several modules from a package
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Aug 16 16:31:23 PDT 2017
https://issues.dlang.org/show_bug.cgi?id=3603
John Hall <john.michael.hall at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |john.michael.hall at gmail.com
--- Comment #4 from John Hall <john.michael.hall at gmail.com> ---
Multiple named imports also discussed here:
https://forum.dlang.org/thread/hashhduapewjhqmwhfwp@forum.dlang.org
------------------------------------
With respect to:
> import really.very.deeply.nested.package: module1, module2, module3;
or
> import std: stdio, algorithm, range, array;
consider:
-----[ foo\package.d ]-----
module foo;
public import foo.bar;
public import foo.baz;
public import foo.bazinga;
-----[ foo\bar.d ]-----
module foo.bar;
void bar() { };
-----[ foo\baz.d ]-----
module foo.baz;
void baz() { };
-----[ foo\bazinga.d ]-----
module foo.bazinga;
void bazinga() { };
------------------------------------
Under your suggestion, if you:
import foo : bar, baz;
how does the compiler know to import the functions or the modules? Under the
current approach, it's not an issue since the selective import only brings in
the symbols.
------------------------------------
I think the alternative would be to introduce a new syntax for selective module
imports, where
import foo :: bar, baz;
causes the modules bar and baz to be imported, but not bazinga. This would be
equivalent to
import foo.bar;
import foo.baz;
Static imports should follow a similar pattern.
It gets a little more complicated with re-named imports where something like
import barbaz = foo :: bar, baz;
may be possible. This functionality currently requires a more challenging
workaround, discussed in the above thread, as it is an error to write
import barbaz = foo.bar;
import barbaz = foo.baz;
because barbaz is assigned to two things.
This functionality may also mix with the current functionality for selective
imports, such as
import foo :: bar, baz : bar, baz;
though this depends on the implementation details, for instance, the following
would not compile
import foo.bar : bar, baz;
import foo.baz : bar, baz;
so the compiler would need to do something like search foo.bar for either bar
or baz and only import them if they are there, cross off what is found, then
search foo.baz for the remainder, and give an error if something isn't found.
In addition, one could have a re-named version
import barbaz = foo :: bar, baz : bar, baz;
which should follow from getting the above to work.
Finally, one point I didn't address specifically was about the deeply nested
modules that the OP refers to. The OPs example of
> import really.very.deeply.nested.package: module1, module2, module3;
would become
> import really.very.deeply.nested.package :: module1, module2, module3;
However, it also would be convenient to be able to write
> import really :: module1, module2, module3;
assuming the module names are unique. I am not sure if this is possible.
--
More information about the Digitalmars-d-bugs
mailing list