Namespace for a module defined by its import path

Jeff Thompson via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 26 02:53:35 PDT 2016


On Wednesday, 26 October 2016 at 07:57:57 UTC, Mike Parker wrote:
> On Wednesday, 26 October 2016 at 07:14:30 UTC, Jeff Thompson 
> wrote:
>
>>>
>>> dmd 
>>> -I/commit_b3bf5c7725c98ee3e49dfc4e47318162f138fe94/version/ 
>>> main.d
>>> dmd 
>>> -I//commit_df0741a84c8a967ea08674090afdff4e9a58d23e/version/ 
>>> main.d
>>
>> This will force the application to use either one version or 
>> the other. As I said, it's a large application. I different 
>> parts of the same application to be able to import the version 
>> they need.
>
> A module named foo.bar is foo.bar. There's no way to have a 
> foo.bar version1 and a foo.bar version2 in the same program. 
> You compile and link one version or the other, period. If you 
> want multiple versions in the same program, then they need to 
> have distinct module names:
>
> foo/bar1.d --> module foo.bar1;
> foo/bar2.d --> module foo.bar2;
>
> I can't see how you would expect it to work otherwise. How 
> would the compiler know that a call to foo.bar.someFunc belongs 
> to one version or another if both have the same fully qualified 
> name?
>
> Or maybe I'm misunderstanding you (and I'm apparently not the 
> only one in this thread). What problem are you trying to solve? 
> Why do you need different versions of the same module or 
> package at the same time in the same program?

I need different versions of the same module at the same time in 
the same program to be able to use multiple libraries, some of 
which have been verified to work one version of the module and 
others to work with another version. It is to be able to have 
reliability in large scale programs where different libraries 
have slightly different dependencies.

I can do this in Node.js. Suppose I have the following files:

commit_b3bf5c7/utils.js
commit_df0741a/utils.js
somelib.js
anotherlib.js

In Node.js, somelib.js can have

var Utils = require('commit_b3bf5c7/utils.js').Utils;

And anotherlib.js can have

var Utils = require('commit_df0741a/utils.js').Utils;

with no conflict whatsoever. Each lib can use the version that it 
knows works correctly.  A file can even include both if it needs 
to:

var Utils1 = require('commit_b3bf5c7/utils.js').Utils;
var Utils2 = require('commit_df0741a/utils.js').Utils;

Again no conflict between using Utils1 and Utils2. The point is 
that the namespace of the identifiers of imported files is 
defined by the file that imports it. This allows much more 
scalability, instead of forcing every library and every library 
it depends on to use the same version of an imported file.


More information about the Digitalmars-d mailing list