[top] [prev] [next]

Modules

A module has the form:

    MODULE id EXPORTS Interfaces;
      Imports;
    Block id.
where id is an identifier that names the module, Interfaces is a list of distinct names of interfaces exported by the module, Imports is a list of import statements, and Block is a block, the body of the module. The name id must be repeated after the END that terminates the body. "EXPORTS Interfaces" can be omitted, in which case Interfaces defaults to id.

If module M exports interface I, then all declared names in I are visible without qualification in M. Any procedure declared in I can be redeclared in M, with a body. The signature in M must be covered by the signature in I. To determine the interpretation of keyword bindings in calls to the procedure, the signature in M is used within M; the signature in I is used everywhere else.

Except for the redeclaration of exported procedures, the names declared at the top level of Block, the visible imported names, and the names declared in the exported interfaces must be distinct.

For example, the following is illegal, since two names in exported interfaces coincide:

    INTERFACE I;
      PROCEDURE X();  ...

    INTERFACE J;
      PROCEDURE X();  ...

    MODULE M EXPORTS I, J;
      PROCEDURE X() = ...;

The following is also illegal, since the visible imported name X coincides with the top-level name X:

    INTERFACE I;
      PROCEDURE X();  ...

    MODULE M EXPORTS I;
      FROM I IMPORT X;
      PROCEDURE X() = ...;

But the following is legal, although peculiar:

    INTERFACE I;
      PROCEDURE X(...);  ...

    MODULE M EXPORTS I;
      IMPORT I;
      PROCEDURE X(...) = ...;

since the only visible imported name is I, and the coincidence between X as a top-level name and X as a name in an exported interface is allowed, assuming the interface signature covers the module signature. Within M, the interface declaration determines the signature of I.X and the module declaration determines the signature of X.

[top] [prev] [next]