quick! where does the following code fail? import std.stdio, std.algorithm: writeln, indexOf; void main(){ writefln("abc"); //1 writeln(map!("a+1")([1,2,3])); //2 std.stdio.writefln("abc"); //3 writeln(std.algorithm.map!("a+1")([1,2,3])); //5 writeln(indexOf("abc","b")); //6 } answer: not 1, but it should 2, as it should not 3, erm ????? not 5, which may well be due to bug 314, or vice versa with 1 not 6, which maybe it shouldn't summary: selective imports can select from multiple modules, but some of the multiple modules get in to this module's symbol table anyways
The selective imports only apply to std.algorithm, not std.stdio. std.algorithm publicly imports std.stdio, and so the selective import of writeln from std.algorithm works. The behavior is as expected.
std.algorithm imports std.stdio privately.
(In reply to comment #1) > The selective imports only apply to std.algorithm, not std.stdio. > > std.algorithm publicly imports std.stdio, and so the selective import of > writeln from std.algorithm works. > > The behavior is as expected. then why is std.algorithm.map in the local module symbol table?
Another test: import std.stdio; void main() { writeln(std.algorithm.map!("a+1")([1,2,3])); // compiles } That succeeds (note lack of std.algorithm import) import std.stdio; void main() { writeln(map!("a+1")([1,2,3])); // error: map not defined } That doesn't. Where is map coming from? std.stdio doesn't use a public import for std.algorithm.
I think the last test compiles due to http://d.puremagic.com/issues/show_bug.cgi?id=314
(In reply to comment #5) > I think the last test compiles due to > http://d.puremagic.com/issues/show_bug.cgi?id=314 yeah, looking back on this, I think all of them are instances of 314 and the rest is confusion about selective imports since the spec does not indicate how to interpret import mod1, mod2, ... modN: identifier; if it were up to me, I'd just disallow multiple module names in this case
*** This issue has been marked as a duplicate of issue 313 ***