"Анри Бертьен. Стандартный набор операторов языка REXX (для OS/2) " - читать интересную книгу автора

вызывающей программе. Внешняя подпрограмма может быть написана на любом
языке (включая REXX), который поддерживает интерфейсы, используемые
интерпретатором для её вызова (более подробную информацию см. на стр. 148).

Во время выполнения внутренней подпрограммы все ранее известные
переменные обычно остаются доступными. Если же Вам необходимо защитить
подпрограмму и вызывающую программу друг от друга - можно использовать
оператор PROCEDURE, который обеспечит для вызванной программы собственный,
отдельный список переменных. Если же Вам необходимо сделать только одну (или
несколько) переменных вызывающей программы доступными подпрограмме -
используйте этот оператор с опцией EXPOSE.
Вызов внешней программы как подпрограммы аналогичен вызову внутренней
подпрограммы, но для внешней подпрограммы всегда подразумевается неявный
оператор PROCEDURE, то есть все переменные вызывающей программы всегда
"спрятаны", а начальными значениями некоторых внутренних переменных и
параметров (например, оператора NUMERIC и т.д.) являются значения,
установленные по умолчанию (а не те, которые установлены в вызывающей
программе).
Когда внутренняя подпрограмма получает управление, номер строки
оператора CALL доступен (содержится в переменной SIGL вызывающей программы).
Этот момент можно использовать при отладке, так как благодаря этому несложно
выяснить, откуда управление передаётся подпрограмме.
Для завершения подпрограммы должен быть выполнен оператор RETURN, в
результате чего управление будет возвращено предложению, следующему за
оператором CALL, осуществлявшим вызов (оператор EXIT, выполненный во внешней
подпрограмме, вызовет то же действие; - во внутренней - завершит всю
программу: этот оператор всегда завершает выполнение всего REXX-файла, в
котором он выдан).
Любые подпрограммы могут включать в себя вызовы любых других
подпрограмм, за исключением попытки вызова неглавной программы во внешнем
REXX-файле - такая возможность не предусмотрена.

Например:

/* Рекурсивное выполнение подпрограммы: */
Arg х
Call factorial х
Say х'! =' result
Exit

Factorial: procedure /* Вычислить факториал путём */
Arg n /* рекурсивного вызова. */
If n<2 then return 1
Call factorial n-1
Return result * n

На время выполнения внутренней подпрограммы (или функции) вся
необходимая информация о состоянии вызывающей программы автоматически
запоминается и после возврата из вызванной подпрограммы восстанавливается. К
этой информации относится следующая: