Comment #0 by ellery-newcomer — 2011-01-04T17:20:43Z
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
Comment #1 by bugzilla — 2011-01-05T00:15:42Z
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.
Comment #2 by andrei — 2011-01-05T00:18:55Z
std.algorithm imports std.stdio privately.
Comment #3 by ellery-newcomer — 2011-01-05T08:50:22Z
(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?
Comment #4 by peter.alexander.au — 2011-01-05T14:09:40Z
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.
Comment #6 by ellery-newcomer — 2011-01-06T17:43:42Z
(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
Comment #7 by code — 2012-02-16T19:09:37Z
*** This issue has been marked as a duplicate of issue 313 ***