[Issue 3603] Allow selective import syntax to import several modules from a package
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Jan 6 14:32:25 UTC 2019
https://issues.dlang.org/show_bug.cgi?id=3603
--- Comment #5 from Nick Treleaven <nick at geany.org> ---
(In reply to John Hall from comment #4)
> import foo : bar, baz;
>
> how does the compiler know to import the functions or the modules?
It could work:
1. If foo is a file called foo.d, it's a module import with selective symbols.
2. If a directory foo/ exists as well, the compiler could show a warning.
3. If foo is not a file but a directory, it's a package import with selective
*modules*.
Although when searching multiple import paths given on the command-line it
could get confusing with conflicts.
> import foo :: bar, baz;
That is clearer syntax and simplifies the feature design, but it seems a bit
inconsistent with fully qualified symbols in code, which use
`package1.module1`, not `package1::module1` (the latter would arguably be
better for FQNs but I doubt it will be added now). `import package foo : bar,
baz;` syntax is another option, and is intuitive.
This Phobos file is a good example case for this feature:
https://github.com/dlang/phobos/blob/master/std/experimental/allocator/building_blocks/package.d#L306
In fact, I think a single package import with selective modules could also
support selectively importing a single symbol from each module (which is a
common case for library code):
import mod : sym1, sym2; // selective symbols from a single module
import package pack : mod1, mod2, mod3; // selective modules from a single
package
import package pack : mod1, mod2 : sym, mod3 : sym; // selective modules plus
optional single selective symbol per module
For multiple selective symbols per module, this is not possible with this
syntax, use a separate import statement per module. This is a better design IMO
than allowing arbitrary `{mod1, mod2 : {sym1, sym2}, mod3 : {sym1, sym2}}` code
because it forces better readability.
The grammar (ignoring renaming) would be something like:
ImportDeclaration:
...
import ModuleIdentifier : SymbolImportList;
import package PackageIdentifier : ModuleImportList;
ModuleImportList:
ModuleIdentifier
ModuleIdentifier : SymbolIdentifier
ModuleIdentifier, ModuleImportList
ModuleIdentifier : SymbolIdentifier, ModuleImportList
--
More information about the Digitalmars-d-bugs
mailing list