The module system supports the structured division of a corpus of Scheme software into a set of modules. Each module has its own isolated namespace, with visibility of bindings controlled by module descriptions written in a special configuration language.
A module may be instantiated multiple times, producing several packages, just as a lambda-expression can be instantiated multiple times to produce several different procedures. Since single instantiation is the normal case, we will defer discussion of multiple instantiation until a later section. For now you can think of a package as simply a module's internal environment mapping names to denotations.
A module exports bindings by providing views onto the underlying package. Such a view is called a structure (terminology from Standard ML). One module may provide several different views. A structure is just a subset of the package's bindings. The particular set of names whose bindings are exported is the structure's interface.
A module imports bindings from other modules by either opening or accessing some structures that are built on other packages. When a structure is opened, all of its exported bindings are visible in the client package. For example:
This configuration defines two structures, foo and bar. foo is a view on a package in which the scheme structure's bindings (including define and +) are visible, together with bindings for a, b, and c. foo's interface is (export a c cons), so of the bindings in its underlying package, foo only exports those three. Similarly, structure bar consists of the binding of d from a package in which both scheme's and foo's bindings are visible. foo's binding of cons is imported from the Scheme structure and then re-exported.(define-structure foo (export a c cons) (open scheme) (begin (define a 1) (define (b x) (+ a x)) (define (c y) (* (b a) y)))) (define-structure bar (export d) (open scheme foo) (begin (define (d w) (+ a (c w)))))
A module's body, the part following begin in the above example, is evaluated in an isolated lexical scope completely specified by the package definition's open and access clauses. In particular, the binding of the syntactic operator define-structure is not visible unless it comes from some opened structure. Similarly, bindings from the scheme structure aren't visible unless they become so by scheme (or an equivalent structure) being opened.
Previous: Module system | Next: The configuration language