Функции
Синтаксис
Вы можете включить вызов функции в выражение, расположенное во внутренней или внешней программе в любом месте, где могут использоваться данные (например, строка). Вызов функции осуществляется по следующей схеме:
Имя-функции представляет собой текстовую строку или единственный символ, которые являются константами.
В скобках можно указать до 20 выражений, разделенных запятыми. Эти выражения называются аргументами функции. Каждое выражение может также включать в себя вызов функции.
Скобка должна следовать непосредственно за именем функции без пробелов между ними, иначе конструкция не будет распознана как вызов функции. (В этом случае предполагается наличие пустого оператора.)
Аргументы вычисляются по очереди слева направо, а затем результаты передаются функции. Это влечет за собой выполнение некоторых операций (обычно зависящих от переданных аргументов, хотя аргументы задавать необязательно) и, возможно, возврат единственной строки символов. Полученная строка затем включается в исходное выражение, как если бы обращение к функции было заменено именем переменной, содержащей данные результирующей строки.
Например, функция SUBSTR встроена в языковый процессор. Ее можно использовать следующим образом: N1='abcdefghijk' Z1='Частью N1 является: 'Substr(N1,2,7) /* присвоит Z1 строку 'Частью N1 является: bcdefgh' */
Если функция вызывается без аргументов, то после ее имени нужно указать скобки, иначе конструкция не будет распознана как вызов функции. date() /* возвращает дату в стандартном формате дд мм гггг */
Обращения к функциям и подпрограммам
Для вызова подпрограмм используется тот же механизм, что и для вызова функций. Единственное отличие состоит в том, что функции должны возвращать результаты, тогда как подпрограммы не обязаны этого делать. Следующие типы программ могут быть вызваны как функции:
Внутренняя | Если имя программы присутствует в процедуре в качестве метки, то сохраняется текущее состояние выполнения, так чтобы позднее можно было вернуться в точку вызова программы для продолжения выполнения процедуры. Затем управление передается первой найденной метке, которая совпадает с именем программы. Как и при вызове программы с помощью инструкции CALL, сохраняется также и некоторая другая информация состояния (назначения TRACE, NUMERIC и тому подобное). Для получения более подробной информации смотрите подраздел Инструкция CALL. Если внутренняя программа, которую нужно вызвать, является функцией, то Вы должны указать выражение в инструкции RETURN для возврата из функции. Это необязательно, если функцию вызывают в качестве подпрограммы.
Пример: /* Рекурсивное выполнение внутренней функции... */ arg x say x'! =' factorial(x) exit factorial: procedure /* вычисление факториала .. */ arg n /* .. рекурсивный вызов. */ if n=0 then return 1 return factorial(n-1) * n FACTORIAL необычен тем, что он вызывает сам себя (это называется рекурсивным вызовом). Использование инструкции PROCEDURE гарантирует, что новая переменная n генерируется для каждого вызова). |
Встроенная | Функции такого типа всегда доступны и описываются в этом разделе позднее. |
Внешняя | Вы можете написать сами или использовать существующие функции, которые будут внешними для программы и языкового процессора. Внешняя функция может быть написана на любом языке (включая REXX), который поддерживает системно-зависимые интерфейсы, используемые языковым процессором для ее вызова. Следует напомнить, что внешняя программа, вызванная как функция, должна вернуть результаты данные вызывающей программе. |