On 08/13/2015 03:42 PM, Jonathan M Davis wrote:
On Thursday, 13 August 2015 at 13:12:44 UTC, Dicebot wrote:
Right now this works:
``D
struct Std
{
public import std.stdio;
}
void main()
{
Std.writeln("Nice!");
}
```
I want to use it as an import hygiene idiom but not entirely sure if
this behavior can be relied upon (or it is just a side effect of
imports being implemented as aliases currently).
Well, that's pretty much why splitting up a module and putting public
imports in its package.d file doesn't break any of the cases where
someone types out the full import path when referring to something from
that module/package. But I doubt that anyone considered that that would
have this effect when you have a scoped import. In fact, to be honest,
it never occurred to me that it would be legal to have a scoped, public
import. I think that you just hit a weird result of how allowing imports
to be put everywhere ended up working.
I confess that I don't particularly like that this is legal (and I think
that public imports tend to get a bit hinky because of the fact that
they create aliases), and I'm not quite sure how you could use it form
"import hygiene,"
It has nothing to do with the import being public. This works:
---
struct Std{
import std.stdio;
}
void main(){
Std.writeln("Nice!");
}
---
(It also works if main and Std are defined in different modules.)
but I also don't see how this could work any other way
if scoped, public imports are allowed.
...
Easy. Just treat aggregate scopes and module scopes differently. (They
are treated differently even now: all imports are 'public' in aggregate
scopes, but not at module scope.) I think this shouldn't be done though.
In any case, I guess we agree that this idiom should work for public
imports, but not for non-public ones (so the current behaviour with
non-public imports is accepts-invalid, but Dicebot's code should be fine)?