: iter-rec {* the base value: normally the function's input value *} ( a {* the termination predicate: called at each step to find out if we're done *} ( a -- BOOL ) {* the termination value: the value used as 'the next value' (see later) when the termination predicate returns true. *} ( -- a ) {* the stepping function: applied to the previous value at each step, to give the value to pass in to the loop, giving the next step *} ( a -- a ) {* the combining function: given the previous step and the next step, return the value to use *} ( a a -- a ) {* and we give back a value of the same type *} -- a ) ... ;