Namespace for a module defined by its import path
Mike Parker via Digitalmars-d
digitalmars-d at puremagic.com
Wed Oct 26 04:56:15 PDT 2016
On Wednesday, 26 October 2016 at 09:53:35 UTC, Jeff Thompson
wrote:
>
> var Utils1 = require('commit_b3bf5c7/utils.js').Utils;
> var Utils2 = require('commit_df0741a/utils.js').Utils;
That works because require operates in terms of files, not
modules. In D, module and package names may have a default
relationship with the file system, but the modules and packages
themselves are wholly constructs of the compiler. `import foo`
knows nothing about any files called foo. You need a way for the
commit_* directories to become a part of the package name so that
you can have distinct namespaces and avoid symbol clashes. If you
can make that happen, then you can do this:
import Utils1 = commit_b3bf5c7.utils;
import Utils2 = commit_df0741a.utils;
You also might be able to generate something at compile time with
string imports and string mixins.
But really, statically compiled languages aren't fit for this
sort of thing. If you can compiled the version-sensitive bits
into shared libraries, define a common interface in the main
program, then load the libraries manually at runtime... that's
the only reasonable way I know of to handle something like this.
You could have multiple versions of the interface implementations
loaded without issue. But I don't believe D's shared library
support is fully implemented across all platforms at the moment.
More information about the Digitalmars-d
mailing list