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 and parameter defaults 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
.
m3-support@elego.de