https://issues.dlang.org/show_bug.cgi?id=3603
--- Comment #5 from Nick Treleaven <[email protected]> --- (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 --
