<< Prev | - Up - | Next >> |
Modules, also known as packages, are collection of procedures and other values1 that are constructed together to provide certain related functionality. A module typically has a number of private procedures that are not visible outside the module and a number of interface procedures that provide the external services of the module. In Oz there is syntactic support for module specification. The concept used is called functor . A functor is an expression that specifies the components of a module. The Mozart system converts a functor to a module with the help of a module manager.
Let us first see what a module is, and then look to a corresponding
functor that specifies the module. In general a module is a bunch of
locally defined entities, e.g. procedures, objects, accessible through a
record interface. Assume that we would like to construct a module called
List
that provides a number of interface procedures for
appending, sorting and testing membership of lists. This would look as
follows.
declare List in
local
proc {Append ... } ... end
proc {MergeSort ...} ... end
proc {Sort ... } ... {MergeSort ...} ... end
proc {Member ...} ... end
in
List = 'export'(append: Append
sort: Sort
member: Member
... )
end
Access to Append
procedure outside of the module
List
is done by using the field
append
from the record List
:
List.append
. Notice that in
the above example the procedure MergeSort
is private to the
module. Most of the base library modules of Mozart follow the above
structure. The above module can be created from a functor that looks as
follows:
functor
export
append:Append
sort:Sort
member:Member
...
define
proc {Append ... } ... end
proc {MergeSort ...} ... end
proc {Sort ... } ... {MergeSort ...} ... end
proc {Member ...} ... end
end
Assuming that this functor is stored, somehow, on the file '/home/xxx/list.ozf', the module can be created as follows:
declare [List]= {Module.link ['/home/xxx/list.ozf']}
Module.link/2
is a function defined in the module Module
that takes a
list of functors, links them together, returns a corresponding list of
modules.
Functors may also have import declarations. If you want to import a system module you can just state the name of its functor. On the other-hand importing a user-defined module requires stating the URL of the file where the functor is stored.
Consider the following functor.
functor
import
Browser
FO at 'file:///home/seif/FileOperations.ozf'
define
{Browser.browse {FO.countLines '/etc/passwd'}}
end
The import
declaration imports
the system module Browser
, and uses the procedure
Browser.browse
. It also
imports the module FO
specified by the functor stored in
the file
'/home/seif/FileOperations.ozf'
, and calls the procedure
FO.countLines
which counts the
number of lines in a file given as argument. This functor is defined for
its effect, therefore it does not export any interface. When this
functor is linked the statement between
define ... end
is executed.
Warning:Given a file
'x.oz'
defining a functor, you
may create the corresponding functor
'x.ozf'
from your shell by
typing the command:
ozc -c x.ozf
<< Prev | - Up - | Next >> |