Imported modules can be parameterized. You can supply a module you're importing with functions, globals, constants, catches and opaque types. Modules declare what they need to be supplied.
Module parameterization is the inverse of exporting. Exporting ships things from within modules to the outside—from the modules to their importers. Module parameterization ships things from outside of modules into them—from the importers into the modules being imported. Exporting is what you mostly want to do, but parameterization is occasionally what you have to do. The most common example is supplying a "call back" function to a module, such as supplying a comparison function to a sorting module.
There are two parts to supplying module parameterization. Within the module you have to declare what you require from whoever's importing you. You do this by providing declarations of the things to be supplied, but with the keyword require
in place of define
or declare
or prefixing global
or constant
. For functions, you leave out the as
or elsewhere
part. For globals and constants you only specify the type and name. And for opaques you leave out the creator. For example:
require opaque sortable-type require switch function compare (value sortable-type a, value sortable-type b) require global integer total-count require constant integer maximum-count require catch maximum-count-exceeded by value string who
The other half of parameterizing modules is supplying the required things from whoever is importing the module. Supplying consists merely of following the keyword supply
with name of the thing to be supplied—the thing has to be declared prior to the supply
, so nothing more need be said about it. On the other hand, you may have to tell the import
which of its requirements this supply
is satisfying—which you do following as
. For example:
import "sort.xmd" prefixed by person- supply person-record as sortable-type supply compare-person as compare
The as
and the following name can be left out when the two names are the same, as in:
import "countfiles.xmd" unprefixed supply total-count supply maximum-count supply maximum-count-exceeded
supply
and use
parts of an import
can be mixed together and put in any order.
Names must be declared before they are supplied. They can either be fully defined, or they can be predeclared in an
elsewhere
declaration:
define record person-record elsewhere define switch function compare-person value person-record a with value person-record b elsewhere import "sort.xmd" prefixed by person- supply person-record as sortable-type supply compare-person as compare
elsewhere
declarations can be used for names imported from other modules as well as names being defined by the current module or program.