| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The export-import mechanism doesn't work well in some cases, such as:
You can use module inheritance in these cases.
A new module inherits from gauche module when created.
If you put (extend scheme) in that module, for example,
the module resets to inherit directly from scheme module
that has only bindings defined in R5RS, hence, after the export
form, you can't use 'import' or any other gauche-specific
bindings in the module.
If a named module is not defined yet, extend
tries to load it, using the same convention use macro does.
A module can inherit multiple modules, exactly the same way as a class can inherit from multiple classes. The resolution of order of inheritance needs to be explained a bit.
Each module has a module precedence list, which lists
modules in the order of how they are searched. When the module
inherits multiple modules, module precedence lists of inherited
modules are merged into a single list, keeping the constraints
that: (1) if a module A appears before module B in some module
precedence list, A has to appear before B in the resulting module
precedence list; and (2) if a module A appears before module B
in extend form, A has to appear before B in the resulting
module precedence list. If no precedence list can be constructed
with these constraints, an error is signalled.
For example, suppose you wrote a library in modules
mylib.base, mylib.util and mylib.system.
You can bundle those modules into one module by creating
a module mylib, as follows:
(define-module mylib (extend mylib.system mylib.util mylib.base)) |
The user of your module just says (use mylib) and
all exported symbols from three submodules become available.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |