Designing the E module system (was: A thought on module systems)

Kevin Reid <kpreid-M/[email protected]>
Newsgroups gmane.comp.lang.e.general
Message-ID <[email protected]>
On Aug 29, 2010, at 4:01, Thomas Leonard wrote:

> On 29 August 2010 03:31, Kevin Reid <kpreid-M/[email protected]> wrote:
>> I think this is an original thought I had about the problem of  
>> modules/
>> libraries:
>>
>>   A module (library) is a stateless unum.
>>
>> Therefore:
>>
>>   Module loading is obtaining a presence of the unum.
>>
>>   Module naming is long-term remote object naming.
>>
>>   Library versioning is an upgrade/protocol-compatibility problem.
>
> By the way, I implemented such a module loading scheme for the ebox  
> demo:
>
>  http://0install.net/ebox.html

Just to get *some* of my thoughts on the matter in writing so we can  
maybe make some progress, I'm going to comment on what I see :

> For example, the "ebox-edit" example application declares a dependency
> on the "ebox-help" library like this:
>
>    <requires interface="http://0install.net/tests/ebox-help.xml">
>      <environment insert="" name="help"/>
>    </requires>

This is good, naming libraries by URLs, and giving the client control  
over how the library is made available. What does the insert=  
parameter mean?

We should not use XML, because XML is designed for document markup,  
and we have a better choice at hand; namely TermL. (Though there is no  
formalized TermL feature serving the role of XML namespaces, yet.)

> This causes a loader for the library to be added to ebox-edit's
> environment (Scope), so that it can import things using e.g.
>
>  def makeHelp := <help:makeHelp>

Does <help> necessarily expose every file in the module as an  
importable item? It should be possible for a module to have private  
components, so that its public interface is well-defined.

What about the module's access to itself? In particular, a module  
should have a reference to its own file tree (as in the <resource>  
loader), or a customizable file-to-object mapping thereof, so that it  
can efficiently store binary data (e.g. images for a GUI library).

> The "interface" URI is both the name of the library and a hint about
> where to get information about it.

Good.

> Incompatible changes use a
> different URI,

Good.

> while backwards-compatible changes just use a different
> version number. Versions can be restricted like this:
>
>    <requires interface="http://0install.net/tests/ebox-help.xml">
>      <environment insert="" name="help"/>
>      <version not-before='1.0' before='2.0'/>
>    </requires>

What is the grammar and ordering of version numbers?

> Downloads get shared automatically, so that if two programs happen to
> use the same version of the same library, then the library only gets
> downloaded and stored on disk once.

It is also important that if there is a diamond dependency

   A requires B --> B requires D
   A requires C --> C requires D

then only one copy of D is loaded into memory, so that B and C have a  
shared vocabulary of objects.

-- 
Kevin Reid                                  <http://switchb.org/kpreid/>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.