Proposal: this.d

kris foo at bar.com
Sun Sep 9 23:11:06 PDT 2007


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.

2c



More information about the Digitalmars-d mailing list