Proposal: this.d

Kirk McDonald kirklin.mcdonald at gmail.com
Sun Sep 9 13:59:12 PDT 2007


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.

-- 
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org



More information about the Digitalmars-d mailing list