D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 5411 - import wtf1
Summary: import wtf1
Status: RESOLVED DUPLICATE of issue 313
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: Other Linux
: P2 normal
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-01-04 17:20 UTC by Ellery Newcomer
Modified: 2012-02-16 19:09 UTC (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Ellery Newcomer 2011-01-04 17:20:43 UTC
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 Walter Bright 2011-01-05 00:15:42 UTC
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 Andrei Alexandrescu 2011-01-05 00:18:55 UTC
std.algorithm imports std.stdio privately.
Comment 3 Ellery Newcomer 2011-01-05 08:50:22 UTC
(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 Peter Alexander 2011-01-05 14:09:40 UTC
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 5 Jacob Carlborg 2011-01-06 02:40:47 UTC
I think the last test compiles due to http://d.puremagic.com/issues/show_bug.cgi?id=314
Comment 6 Ellery Newcomer 2011-01-06 17:43:42 UTC
(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 Martin Nowak 2012-02-16 19:09:37 UTC

*** This issue has been marked as a duplicate of issue 313 ***