Chapter 10Language extensions

1Recursive definitions of values

(Introduced in Objective Caml 1.00)

As mentioned in section ‍9.7.2, the let rec binding construct, in addition to the definition of recursive functions, also supports a certain class of recursive definitions of non-functional values, such as

let rec name1 = 1 ::name2 andname2 = 2 ::name1 inexpr

which binds name1 to the cyclic list 1::2::1::2::…, and name2 to the cyclic list 2::1::2::1::…Informally, the class of accepted definitions consists of those definitions where the defined names occur only inside function bodies or as argument to a data constructor.

More precisely, consider the expression:

let rec name1 =expr1 andandnamen =exprn inexpr

It will be accepted if each one of expr1 …  exprn is statically constructive with respect to name1 …  namen, is not immediately linked to any of name1 …  namen, and is not an array constructor whose arguments have abstract type.

An expression e is said to be statically constructive with respect to the variables name1 …  namen if at least one of the following conditions is true:

An expression e is said to be immediately linked to the variable name in the following cases: