General-Purpose Mail Filter
A module file must begin with a module declaration:
module modname [interface-type].
Note the final dot.
The modname parameter declares the name of the module. It is recommended that it be the same as the file name without the ‘.mf’ extension. The module name must be a valid MFL literal. It also must not coincide with any defined MFL symbol, therefore we recommend to always quote it (see example below).
The optional parameter interface-type defines the default scope of visibility for the symbols declared in this module. If it is ‘public’, then all symbols declared in this module are made public (importable) by default, unless explicitly declared otherwise (see scope of visibility). If it is ‘static’, then all symbols, not explicitly marked as public, become static. If the interface-type is not given, ‘public’ is assumed.
The actual MFL code follows the ‘module’ line.
The module definition is terminated by the logical end of its
compilation unit, i.e. either by the end of file, or by the
bye, whichever occurs first.
bye may be used to prematurely end the current
compilation unit before the physical end of the containing file.
Any material between
bye and the end of file is ignored by the
Let’s illustrate these concepts by writing a module ‘revip’:
module 'revip' public. func revip(string ip) returns string do return inet_ntoa(ntohl(inet_aton(ip))) done bye This text is ignored. You may put any additional documentation here.
This document was generated on January 3, 2019 using makeinfo.Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.