Extensible functions
Extensible functions allow to define functions by pattern matching which are extensible by adding of new cases which are inserted automatically at the good place by comparing the patterns. The pattern cases are ordered according to syntax trees representing them, "when" statements being inserted before the cases without "when".
Notice that extensible functions are functional: when extending a function, a new function is returned.
The extensible functions are used in the pretty printing system of Camlp5.
Syntax
The syntax of the extensible functions, when loading "pa_extfun.cmo" is the following:
expression ::= extensible-function extensible-function ::= "extfun" expression "with" "[" match-cases "]" match-cases ::= match-case "|" match-cases match-case ::= pattern "->" expression | pattern "when" expression "->" expression
It is actually the same syntax than the one of "match" and "try" constructions.
Semantics
The statement "extend" defined by the syntax takes an extensible function and return another extensible function with the new match cases inserted at good places into the initial extensible function.
Extensible functions are of type "Extfun.t a b
", which
is an abstract type, where "a
" and "b
" are
respectively the type of the patterns and the type of the
expressions. It corresponds to a function of type "a ->
b
".
The function "Extfun.apply
" takes an extensible
function as parameter and return the function which can be applied
like a normal function.
The value "Extfun.empty
" is an empty extensible
function, of type "Extfun.t 'a 'b
". When applied with
"Extfun.apply
" and a parameter, it raises the exception
"Extfun.Failure
" whatever the parameter.
For debugging, it is possible to use the function
"Extfun.print
" which displays the match cases of the
extensible functions. Actually, only the patterns are displayed in
clear, the associated expressions are not.
The match cases are inserted according to the following rules:
- The match cases are inserted in the order they are defined in the
syntax "
extend
" - A match case pattern with "when" is insered before a match case pattern without "when".
- Two match cases patterns both with "when" or both without "when" are insered according to the alphabetic order of some internal syntax tree of the patterns where bound variables names are not taken into account.
- If two match cases patterns without "when" have the same patterns internal syntax tree, the initial one is silently removed.
- If two match cases patterns with "when" have the same patterns internal syntax tree, the new one is inserted before the old one.