Язык процедур 2-REXX для OS-2


Функции API


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

RXFUNCADD

RXFUNCADD регистрирует функцию с указанным именем и делает ее доступной для процедур REXX. Код возврата, равный 0, свидетельствует об успешной регистрации.

RXFUNCDROP

RXFUNCDROP перемещает (удаляет) функцию с указанным именем из списка доступных функций. Код возврата, равный 0, свидетельствует об успешном удалении.

RXFUNCQUERY

RXFUNCQUERY запрашивает список доступных функций для регистрации функции с указанным именем. Код возврата, равный 0, свидетельствует о регистрации функции; код возврата, равный 1, свидетельствует о том, что функция не зарегистрирована.

RXQUEUE

RXQUEUE используется в процедурах REXX для создания и удаления очередей внешних данных, а также для установления и опроса имен этих очередей.




Примечания:


  1. Вызов внешней программы REXX как функции аналогичен вызову внутренней программы. Однако внешняя программа является неявной ПРОЦЕДУРОЙ, в которой всегда удаляются все переменные вызывающей программы и состояние внутренних значений (назначения NUMERIC и т.д.) принимается по умолчанию (а не передаются из вызывающей программы).

  2. Другие программы REXX могут быть вызваны как функции. Вы можете использовать инструкции EXIT или RETURN для выхода из вызванной программы REXX; в любом случае нужно указать выражение.


Порядок просмотра

Порядок поиска функций аналогичен порядку их описания в этом разделе. Внутренние метки имеют наивысший приоритет, затем следуют встроенные функции, а последними идут внешние функции.

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

Пример: /* Модифицированная DATE, выдающая по умолчанию отсортированную дату */ date: procedure arg in if in='' then in='Sorted' return 'DATE'(in)

Встроенные функции имеют имена, набранные прописными буквами. Для успешного поиска встроенной функции имя в текстовой строке должно быть указано прописными буквами, как это показано в предыдущем примере. Это справедливо и для внешних функций.

Внешние функции и подпрограммы имеют системно-зависимый порядок поиска.

REXX осуществляет поиск внешних функций в следующем порядке:


  1. Функции, которые были загружены в макропространство для внеочередного выполнения
  2. Функции, являющиеся частью пакета функций
  3. Функции REXX, расположенные в текущем каталоге, с текущим расширением
  4. Функции REXX, расположенные по пути, заданному переменной среды PATH, с текущим расширением
  5. Функции REXX, расположенные в текущем каталоге, со стандартным расширением
  6. Функции REXX, расположенные по пути, заданному переменной среды PATH, со стандартным расширением
  7. Функции, которые были загружены в макропространство для выполнения в последнюю очередь.




Ошибки во время выполнения

Если внешняя или встроенная функция обнаруживает ошибку любого рода, то она извещает языковый процессор и выдает сообщение о синтаксической ошибке. При этом завершается обработка предложения, содержащего вызов функции. Аналогично, если внешней функции не удается правильно выдать результирующие данные, то это также обнаруживается языковым процессором и фиксируется как ошибка.

Если синтаксическая ошибка происходит в процессе выполнения внешней функции, то эту ошибку можно отследить (с помощью SIGNAL ON SYNTAX) и исправить. Если ошибка не отслеживается, то выполнение программы завершается.

Возвращаемые значения

Обычно функция возвращает некоторое значение, которое подставляется на место ее вызова после вычисления выражения.

Способ обработки значений, возвращенных в результате выполнения функции (или любой программы REXX), зависит от того, как она была вызвана: как функция или как подпрограмма с помощью инструкции CALL.

Программа, вызываемая как подпрограмма: Если программа возвращает некоторое значение, то оно запоминается в специальной переменной с именем RESULT. В противном случае переменная RESULT освобождается и ее значением является строка RESULT.

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

Примеры:

/* Различные способы вызова процедуры REXX */ call Beep 500, 100 /* Пример 1: вызов подпрограммы */ bc = Beep(500, 100) /* Пример 2: вызов функции */ Beep(500, 100) /* Пример 3: результат, переданный */ /* как команда */

  • В примере 1 встроенная функция BEEP вызывается как подпрограмма REXX. Значение, возвращаемое из BEEP, помещается в специальную переменную RESULT языка REXX.

  • В примере 2 BEEP вызывается как функция REXX. Значение, возвращаемое функцией, записывается в ту позицию, в которой ранее был указан вызов функции. Предложение само по себе является оператором присваивания, поэтому значение, возвращенное после выполнения функции BEEP, помещается в переменную bc.



  • В примере 3 функция BEEP выполняется и значение, полученное после ее выполнения, подставляется в выражение для вызова функции, как в примере 2. Однако в этом случае предложение сводится к единственному выражению; поэтому вычисленное выражение передается как команда в текущую среду.


Прим.    Многие другие языки (такие как С) не используют значение, возвращаемое после выполнения функции, если оно не присвоено какой-либо переменной. Однако в языке REXX возвращаемое значение (как показано в примере 3) передается в текущую среду либо обработчику подкоманд. Если текущая среда - CMD (по умолчанию), то это действие вызовет поиск операционной системой на диске команды с указанным именем.
Встроенные функции

Язык REXX предлагает широкий выбор встроенных функций. Среди них есть функции для работы с символами, функции преобразования и информационные функции.

Ниже приведены общие замечания, касающиеся встроенных функций: