8.2 Imports

So far, we have either used modules directly available in the interactive environment or explicitly obtained new ones by invoking Module.link or Module.apply. When writing functors, a better alternative is available: using import declarations. Let's write a module that exports a Greet procedure which prints hello world!:

declare 
functor Foo 
import 
   System at 'x-oz://system/System.ozf' 
export 
   greet : Greet
define 
   proc {Greet}
      {System.showInfo "hello world!"}
   end 
end

Let's have a look at this functor value with {Inspect Foo}:

As we can see, the functor indicates that the module it describes exports a nullary procedure on feature greet and that it imports one module from URI x-oz://system/System.ozf. Let's try it out immediately thus:

declare [M]={Module.apply [Foo]}
{M.greet}

The import section begins with the keyword import and contains one or more import specifications. Here there is only one:

   System at 'x-oz://system/System.ozf'

it states that variable System should be bound to the module which can be constructed from the functor at the URI identified by atom 'x-oz://system/System.ozf'. Instead of an abstract URI, you could also have a file name or a URL. For libraries which are part of the Mozart system, a shorter form of imports is also supported:

import System

is exactly equivalent to:

import System at 'x-oz://system/System.ozf'

That is: the name of the variable is automatically used to construct the appropriate URI. For modules not part of the Mozart library you must use the long form. Also for exports, there is a similar kind of short form:

export Greet

is exactly equivalent to:

export greet : Greet

The name of the variable is used to infer the name of the export feature by downcasing its first letter. Thus our functor can be more simply written:

declare 
functor Foo 
import System
export Greet
define 
   proc {Greet}
      {System.showInfo "hello world!"}
   end 
end


Denys Duchier, Claire Gardent and Joachim Niehren
Version 1.3.99 (20050412)