Proposal: this.d

Bill Baxter dnewsgroup at billbaxter.com
Sun Sep 9 23:48:49 PDT 2007


kris wrote:
> Kirk McDonald wrote:
>> I brought this up in the "Modules vs Packages" thread, where it was 
>> received positively. I think it deserves its own thread.
>>
>> Suppose you have a package, called pkg:
>>
>> pkg/
>>   foo.d
>>   bar.d
>>   baz.d
>>
>> It is useful to have a central import-point for the package. By 
>> convention, this is often called "pkg.all" or "pkg.pkg". It might look 
>> like this:
>>
>> // pkg/all.d
>> module pkg.all;
>>
>> public import foo : a, b;
>> public import bar : c, d;
>> //----
>>
>> Then the user of your package would "import pkg.all;" and get your 
>> package's public API.
>>
>> This is a common enough operation that I propose adding language 
>> support for it.
>>
>> When a user says "import pkg;" (where pkg is a package), it should 
>> actually import a special module called "pkg/this.d". The name "this", 
>> being a keyword, cannot be used as a regular module name, and so there 
>> is no chance of it interfering with existing packages. It also evokes 
>> existing D syntax.
>>
>> Our above example would look like this:
>>
>> pkg/
>>   this.d
>>   foo.d
>>   bar.d
>>   baz.d
>>
>> // pkg/this.d
>> module pkg;
>>
>> public import foo : a, b;
>> public import bar : c, d;
>> //----
>>
>> Saying "import pkg;" refers to this module.
>>
>> The module declaration requires some explanation. Using either "module 
>> pkg;" or "module pkg.this;" might work, but either option is a little 
>> inconsistent. The important point here is that the name the module is 
>> imported as is different than its filename. (This is why the feature 
>> requires compiler support.)
>>
>> Using "module pkg;" is to be preferred, since it is the name the 
>> module is imported as. It is not difficult to, given "import pkg;", 
>> determine that "pkg" is a directory, and look for a this.d inside it. 
>> Nor is it difficult to do the reverse: Given a file named "this.d", 
>> determine that it is the import point of a package.
>>
>> There is one detail to go over. Suppose we say "import pkg;". Should 
>> we now be able to say "pkg.baz", even though the name "baz" is not 
>> publically imported inside of pkg/this.d? I would say no. In this 
>> respect, the this.d should act no differently than any other module. 
>> This is, if nothing else, the simplest behavior.
>>
> 
> The issue with this is bloat, where (1) D is not at all good at dropping 
> modules that are not actually needed (they'll often get linked anyway), 
> and 
>(2) the "where the feck are we?" syndrome where you've no idea what 
> module a specific symbol might come from, or whether half of the imports 
> are even required anymore due to code-motion or other edits. The latter 
> is partly why "import x.*;" is considered rather poor form in Java land.

You're talking there specifically about the question of whether pkg.baz 
should be automatically accessible, right?

--bb



More information about the Digitalmars-d mailing list