Next: Domain Name System, Previous: Conditional Execution, Up: Tutorial [Contents][Index]
As any programming language, MFL supports a concept of function, i.e. a body of code that is assigned a unique name and can be invoked elsewhere as many times as needed.
All functions have a definition that introduces types and names of the formal parameters and the result type, if the function is to return a meaningful value (function definitions in MFL are discussed in detail in see User-Defined Functions).
A function is invoked using a special construct, a function call:
name (arg-list)
where name is the function name, and arg-list is a comma-separated list of expressions. Each expression in arg-list is evaluated, and its type is compared with that of the corresponding formal argument. If the types differ, the expression is converted to the formal argument type. Finally, a copy of its value is passed to the function as a corresponding argument. The order in which the expressions are evaluated is not defined. The compiler checks that the number of elements in arg-list match the number of mandatory arguments for function name.
If the function does not deliver a result, it should only be called as a statement.
Functions may be recursive, even mutually recursive.
Mailfromd
comes with a rich set of predefined functions
for various purposes. There are two basic function classes:
built-in functions, that are implemented by the MFL
runtime environment in mailfromd
, and library
functions, that are implemented in MFL. The built-in
functions are always available and no preparatory work is needed before
calling them. In contrast, the library functions are defined in
modules, special MFL source files that contain functions
designed for a particular task. In order to access a library
function, you must first require a module it is defined in.
This is done using require
statement. For example, the
function hostname
looks up in the DNS the name
corresponding to the IP address specified as its argument. This
function is defined in module dns.mfl, so before calling it you
must require this module:
require dns
The require
statement takes a single argument: the name of the
requested module (without the ‘.mfl’ suffix). It looks up the
module on disk and loads it if it is available.
For more information about the module system See Modules.
Next: Domain Name System, Previous: Conditional Execution, Up: Tutorial [Contents][Index]