A function usually returns a value that is substituted for the function call when the expression is evaluated.
How the value returned by a function (or any Rexx routine) is handled depends on whether it is called by a function call or as a subroutine with the CALL instruction.
A routine called as a subroutine: If the routine returns a value, that value is stored in the special variable named RESULT. Otherwise, the RESULT variable is dropped, and its value is the string RESULT.
A routine called as a function: If the function returns a value, that value is substituted in the expression at the position where the function was called. Otherwise, the language processor stops with an error message.
Here are some examples of how to call a Rexx procedure:
call Beep 500, 100 /* Example 1: a subroutine call */
The built-in function BEEP is called as a Rexx subroutine. The return value from BEEP is placed in the Rexx special variable RESULT.
bc = Beep(500, 100) /* Example 2: a function call */
BEEP is called as a Rexx function. The return value from the function is substituted for the function call. The clause itself is an assignment instruction; the return value from the BEEP function is placed in the variable bc.
Beep(500, 100) /* Example 3: result passed as */ /* a command */
The BEEP function is processed and its return value is substituted in the expression for the function call, like in the preceding example. In this case, however, the clause as a whole evaluates to a single expression. Therefore, the evaluated expression is passed to the current default environment as a command.
Note: Many other languages, such as C, throw away the return value of a function if it is not assigned to a variable. In Rexx, however, a value returned like in the third example is passed on to the current environment or subcommand handler. If that environment is the default, the operating system performs a disk search for what seems to be a command.