Module parameterization

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.