DIP16: Transparently substitute module with package

Steven Schveighoffer schveiguy at yahoo.com
Thu Apr 5 05:58:12 PDT 2012


On Thu, 05 Apr 2012 08:49:24 -0400, deadalnix <deadalnix at gmail.com> wrote:

> Le 05/04/2012 13:46, Steven Schveighoffer a écrit :
>> I don't like this proposal, simply because this means one
>> function/symbol per submodule. It should be more flexible than that. But
>> I like the line of thinking.
>>
>> Let's re-examine the issue. We need to allow splitting of a module X.d
>> into pieces for maintenance (or possibly accessibility -- disallowing
>> friends). But we don't want to break code which currently uses FQN to
>> access X's symbols.
>>
>> I think the following might work:
>>
>> algorithm.d:
>>
>> import this = std.algorithm_impl.sort;
>>
>> Which then imports std.algorithm_impl.sort, and effectively aliases all
>> its symbols into algorithm.d. If std.algorithm_impl.sort defines a
>> function called sort, then it's also aliased to std.algorithm.sort. In
>> essence, sort has *two* FQN, but there are no FQN that refer to more
>> than one symbol.
>>
>> I purposely left out the package.d idea because it's orthogonal to this.
>>
>> -Steve
>
> The behavior you described has been proposed for public import, and have  
> been discussed. This is interesting.
>
> You propose an alternative syntax with is fine and have the advantage to  
> not disturb already existing public imports, but have the drawback to  
> create a new syntax, again.
>
> If such a syntax is adopted, what would be the point of public imports ?  
> If it is still useful, then your syntax is a better choice, otherwise,  
> we'd better modify public import.

No, public imports simply mean that you can view the publicly imported  
module.  It does *not* add aliases to the importing module.

for example:

foo.d:

module foo;

int x;

bar.d:
module bar;
public import foo;

int y;

main.d:
import bar; // publicly imports foo.

void main()
{
    foo.x = 5; // ok, publicly imported via bar (non public, this would be  
an error)
    bar.y = 5; // ok
    bar.x = 5; // error, public import doesn't create new fully qualified  
name for foo.x
}

With the system I propose, using the specific technique would make it so  
bar.x would also be valid, and would refer to foo.x

I think we need new syntax, or a new language feature, because you don't  
want to alter the operation of existing code.  Simply changing public  
imports would cause lots of existing code to be reinterpreted, possibly in  
a way not intended, or that would be ambiguous.

-Steve


More information about the Digitalmars-d mailing list