On Fri, Jun 4, 2010 at 5:17 PM, David Herman <dher...@mozilla.com> wrote:
> By keeping modules second class, we get a number of benefits, not
> just handling cyclic dependencies. (In fact, cyclic dependencies can
> be handled nicely in a first-class module system as well.) One of
> the benefits of second-class modules is the ability to manage static
> bindings; for example, import m.*; is statically manageable. Allen
> has made some good points about how second-class modules are a good
> fit for the programmer's mental model of statically delineated
> portions of code. At any rate, cyclic dependencies are not the
> central point.

As far as I can tell, Simple Modules only changes the composition
hazard introduced by "imoprt m.*" from a run-time hazard to a
link-time hazard.

Consider the modules A, B, and C as developed without coordination
by Alice, Bob, and Charlie respectively, as Charlie updates his
version of C in the following manner:

Before:

    A.js
        import B.*;
        import C.*;
        assert.equal(foo, 10);
    B.js
        export foo = 10;
    C.js
        export bar = 20;

After:

    A.js
        import B.*;
        import C.*; // link-error that requires Alice's attention
        assert.equal(foo, 10);
    B.js
        export foo = 10;
    C.js
        export foo = 30; // change introduced by Charlie
        export bar = 20;

This being the case, I consider this neither a future nor a curse.  It
is worth noting, however, that this particular hazard has bitten me in
practice, and the CommonJS wisely omitted this feature against my
wishes, and I have not had reason to complain since.

>> The loader proposal reintroduces the idea of a "better eval", being
>> simply a hermetic evaluator that collects a working set of modules,
>> links them, and executes them.
>
> It's more than eval -- e.g., it provides load hooks to manage
> resource fetching and even allow transformation -- but yes, it does
> provide a more controlled eval.

This I had not noticed before.  I now see that the Loader constructor
accepts a handler that has an opportunity to either provide source
code, redirect, or reject a module.  This is great.  It also accepts
the global record that I proposed in as a BONUS, which is also full of
win.

> That's not true. Loaders are about isolation. I agree with you that
> conceptually, there's a level of granularity that consists of a set
> of modules, which is often what we mean by "package," at least in
> common usage (if not the particular meaning of that term in a given
> language). But the idea of nested/hierarchical modules is that
> modules scale to the large by simply making modules that consist of
> nested modules.

Perhaps you could point to or provide some sample code that
illustrates collecting modules.  My guess is that it would require a
lot of explicit linkage, rather than harnessing the hierarchy in which
the modules are organized.

> This is also not true; the ability to attach modules to module
> loaders (as well as the dynamic evaluation methods) makes it
> possible for separate module loaders to communicate. However,
> loaders aren't about linking multiple working sets, but rather
> providing isolated subspaces. (One use case I sometimes use is an
> IDE implemented in ES, that wants to run other ES programs without
> them stepping on its toes.)

Code examples would be insightful.

>> Another feature of Simple Modules is that it preserves the
>> "equivalence by concatenation" property of existing "script" tags,
>> while liberating the scripts from being sensitive to the order in
>> which they are concatenated.  This is in conflict with the goal of
>> removing autonomous module blocks.

> I don't quite understand this,

I hope that this is because I have misinterpreted the way module names
are scoped.

>> Simple Modules, at present, will not sufficiently assist people
>> constructing applications and APIs by composing non-coherent groups
>> of name spaces produced by non-cooperating groups of developers.

> The simple modules proposal explicitly *solves* the problems of
> Java-like systems where everything is hard-wired.  Instead, modules
> are given lexically scoped names, and can even be deployed without
> naming themselves; both of these features make it far easier to
> share code between different teams.

Perhaps I am misunderstanding the scope of a module name.  Is it not
true that a module is available by its self declared name in all
modules that share a loader?  Is it actually possible to bind a single
module name that provides access to all of the modules in another
loader?

    module X = load("http://example.com/api";);
    module Y = X.Y; // is this possible?

Is it possible for MRL's to be CommonJS top-level and relative module
identifiers?  If that's the case, is it possible for the loader
handler to forward a request for a module to another loader?

    var externalLoaders = {};
    Loader(function (id, request) {
        var parts = id.split("/");
        if (parts[0] === "." || parts[0] === "..") {
            // what is the identifier of the module from which this
            // module was requested?  I need that to resolve the
            // identifier of the request module.
            when(fetch(id),
                request.provideSource,
                request.reject
            );
        } else {
            var external = externalLoaders[parts[0]];
            request.provideLoader(external, parts.slice(1).join("/"));
        }
    })

I think it might be best to organize the syntax around MRL's rather
than local short-names.  MRL's can be reasonably short if they're
permitted to be relative paths, which requires the module loader
handler to receive the MRL of the requesting module.

Kris Kowal
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to