DIP16: Transparently substitute module with package
Steven Schveighoffer
schveiguy at yahoo.com
Wed Apr 4 07:08:34 PDT 2012
On Mon, 02 Apr 2012 20:44:09 -0400, Michel Fortin
<michel.fortin at michelf.com> wrote:
> On 2012-04-02 13:04:31 +0000, "Steven Schveighoffer"
> <schveiguy at yahoo.com> said:
>
>> On Fri, 30 Mar 2012 17:45:36 -0400, Michel Fortin
>>
>>> The problem is that if .std.algorithm.package
>>> contains a sort function and there is also a module called
>>> std.algorithm.sort, the fully-qualified name of that 'sort' module wil
>>> l
>>> become ambiguous. Moreover, whether the fully-qualified name
>>> .std.algorithm.sort is ambiguous or not depends on what modules were
>>> imported, which is not a very desirable behaviour.
>> So this becomes an error. I don't see this as a major problem. Just
>> don't name a module sort inside std/algorithm.
>> This is no different than ambiguous templates, which are allowed until
>> y ou
>> want to instantiate one.
>
> If you have ambiguous templates in the same module, it'll always be
> ambiguous irrespective of what you import (and you can blame the
> module's designer for it). If you have ambiguous templates residing in
> different modules the symbol will be unambiguous until you've imported
> the second module (same as overloaded functions). At that point you can
> disambiguate using the fully-qualified name of the template (or
> function).
>
> Whereas if the fully-qualified name of a module becomes ambiguous
> because of a symbol in another module, there is no way to disambiguate.
> All you can do is avoid importing the two conflicting modules together,
> just like when you encounter two headers trying to define the same
> symbol in C/C++.
How does this happen? The FQN cannot be ambiguous.
For example, if we change std/algorithm.d into:
std/algorithm/sorting.d which defines sort
std/algorithm/finding.d which defines find
std/algorithm/package.d which imports sorting.d and finding.d
Then how can importing some other module make the FQN ambiguous? The FQN
for sort is std.algorithm.sorting.sort. Now, if you define the symbol
sort inside std/algorithm/package.d, you have an ambiguity, but so what?
If you are responsible for the std.algorithm module, aren't you
responsible for all the files in that pseudo-package? I don't see how it
changes things from today. Basically, my point is the only ambiguity FQN
in the package.d file can create is with other symbols within that same
directory, therefore within the same module.
All we have to do is adopt the practice that phobos' package.d will only
publicly import other modules. It won't define any symbols. Then there
will always be an unambiguous FQN.
Hm... maybe you mean if you can have std/algorithm/package.d do something
like import std.file, which contains another sort function, is that now
packaged under std.algorithm.sort? I don't think that's possible in the
given DIP.
-Steve
More information about the Digitalmars-d
mailing list