Helma Logo
main list history
previous version  overview  next version

Version 13 by hannes on 15. April 2008, 17:28

The include() function in Helma 2 tries to loosely imitate the *semantics of python's import statement|http://www.effbot.org/zone/import-confusion.htm* in order to allow applications to be written in a truly modular way. These are some of the design goals:

* By default, the scriptcore import mechanism include() function loads scripts into separate scopes matching the library's script name.
* The scope name can be overridden by passing a second argument to the import include() function.
* Never is a library imported into the top level scope.
* If a library is imported into a scope that alreay is defined in the current script's code, the previous value is overwritten.
* Imported libraries are local to the script that imported them (which is possible because the script lives itself in its own scope).
* (If the same library is imported from different scripts within one application (possibly using different scope names), only one version of the library is instanciated and shared among the importing scripts.)?
* Imported libraries are aware of their location so they can use relative path names for local imports and references to other resources.

A simplistic implementation of most of the behaviour described above in the Rhino shell may look like this:

  // set reference to global object
  var __global__ = __global__ || this;
  function include(script, as) {
    var scope = new Object();
    scope.__parent__ = null;
    scope.__proto__ = __global__;
    // scope is now a top level scope that inherits
    // from the global, shared top level scope
    this[as] = scope;

Of course, Helma 2 also takes care of script reloading and stuff.