<< 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 >> |