Next: , Previous: Arbitrary control structures, Up: Control Structures


5.8.5 Calls and returns

A definition can be called simply be writing the name of the definition to be called. Normally a definition is invisible during its own definition. If you want to write a directly recursive definition, you can use recursive to make the current definition visible, or recurse to call the current definition directly.

recursive       compilation – ; run-time –         gforth       “recursive”

Make the current definition visible, enabling it to call itself recursively.

recurse       compilation – ; run-time ?? – ??         core       “recurse”

Call the current definition.

Programming style note: I prefer using recursive to recurse, because calling the definition by name is more descriptive (if the name is well-chosen) than the somewhat cryptic recurse. E.g., in a quicksort implementation, it is much better to read (and think) “now sort the partitions” than to read “now do a recursive call”.

For mutual recursion, use Deferred words, like this:

     Defer foo
     
     : bar ( ... -- ... )
      ... foo ... ;
     
     :noname ( ... -- ... )
      ... bar ... ;
     IS foo

Deferred words are discussed in more detail in Deferred Words.

The current definition returns control to the calling definition when the end of the definition is reached or EXIT is encountered.

EXIT       compilation – ; run-time nest-sys –         core       “EXIT”

Return to the calling definition; usually used as a way of forcing an early return from a definition. Before EXITing you must clean up the return stack and UNLOOP any outstanding ?DO...LOOPs.

;s       R:w –        gforth       “semis”

The primitive compiled by EXIT.