ABBREV
Функция ABBREV возвращает результат 1, если значение инфо совпадает с первыми символами значения информации и длина инфо не меньше, чем длина. Функция ABBREV возвращает результат 0, если вышеперечисленные условия не выполняются.
Длина, если она указана, должна представлять собой целое неотрицательное число. Длина, принимаемая по умолчанию, равна количеству символов в значении инфо.
Ниже приведено несколько примеров: ABBREV('Print','Pri') -> 1 ABBREV('PRINT','Pri') -> 0 ABBREV('PRINT','PRI',4) -> 0 ABBREV('PRINT','PRY') -> 0 ABBREV('PRINT','') -> 1 ABBREV('PRINT','',1) -> 0
Прим. | Если указана длина, равная 0, то это соответствует пустой строке (или значению по умолчанию). Поэтому при желании можно автоматически выбирать ключевые слова, принимаемые по умолчанию. Например: say 'Введите режим:'; pull option . select /* keyword1 принимается по умолчанию */ when abbrev('keyword1',option) then ... when abbrev('keyword2',option) then ... ... otherwise nop; end; |
ABS (Абсолютное значение)
Функция ABS возвращает абсолютное значение числа. Результат не имеет знака и форматирован в соответствии с текущими установками NUMERIC.
Ниже приведено несколько примеров: ABS('12.3') -> 12.3 ABS(' -0.307') -> 0.307
ADDRESS
Функция ADDRESS возвращает текущее имя среды, в которую будут направляться команды компьютера. Обрамляющие пробелы из результата удаляются.
Ниже приведено несколько примеров: ADDRESS( ) -> 'CMD' /* среда OS/2 */ ADDRESS( ) -> 'EDIT' /* среда редактора */
ARG
Функция ARG возвращает процедуре или внутренней программе строку аргументов или информацию о строках аргументов.
Если Вы не указываете параметр, то в качестве результата будет возвращено количество аргументов, переданных процедуре или внутренней программе.
Если Вы укажете только n, то в качестве результата будет возвращена строка аргументов с порядковым номером n. При отсутствии строки аргументов в качестве результата возвращается пустая строка. Значение n должно быть целым положительным числом.
Если указан режим, то функция ARG проверяет наличие строки аргументов с порядковым номером n. Действительными режимами для функции ARG (при указании которых имеют значение только начальные буквы, остальные игнорируются) являются следующие:
Exists | Возвращает результат 1, если существует аргумент с порядковым номером n; т.е. если этот аргумент был явно указан при вызове программы. В противном случае возвращается результат 0. | Omitted | Возвращает результат 1, если опущен аргумент с порядковым номером n; т.е. если этот аргумент не был явно указан при вызове программы. В противном случае возвращается результат 0. |
Ниже приведено несколько примеров: /* строка вызова подпрограммы: "Call name;" (без аргументов) */ ARG( ) -> 0 ARG(1) -> '' ARG(2) -> '' ARG(1,'e') -> 0 ARG(1,'O') -> 1
/* строка вызова подпрограммы: "Call name 'a',,'b';" */ ARG( ) -> 3 ARG(1) -> 'a' ARG(2) -> '' ARG(3) -> 'b' ARG(n) -> '' /* для n>=4 */ ARG(1,'e') -> 1 ARG(2,'E') -> 0 ARG(2,'O') -> 1 ARG(3,'o') -> 0 ARG(4,'o') -> 1
Примечания:
Вы можете восстановить и непосредственно разобрать по переменным строки аргументов для программы или внутренней функции с помощью инструкции ARG или PARSE ARG. Программы, вызываемые как команды, могут иметь только одну строку аргументов или не иметь их вовсе. Считается, что программа не имеет аргументов, если она вызывается только по имени; и имеет одну строку аргументов, если к имени команды добавлено еще что-нибудь (включая пробелы). Программы, вызываемые с помощью точки входа REXXSTART, могут иметь множество строк аргументов.
B2X (Двоичное в шестнадцатеричное)
Функция B2X преобразует двоичную_строку, т.е. строку, состоящую из цифр (0 или 1), в эквивалентную строку шестнадцатеричных символов. В двоичную_строку для обеспечения лучшей читабельности можно при желании включать пробелы (не обрамляющие, а только ограничивающие четыре цифры); при преобразовании они игнорируются.
При записи шестнадцатеричных цифр в результирующей строке для значений A-F используются строчные буквы; пробелы в строку не включаются.
Двоичная_строка может иметь любую длину; если она пустая, то и результирующая строка тоже будет пустой. Если количество двоичных цифр в строке не кратно четырем, то перед выполнением преобразования слева добавляются нули (максимум три нуля), пока количество цифр не станет кратно четырем.
Ниже приведено несколько примеров: B2X('11000011') == 'C3' B2X('10111') == '17' B2X('101') == '5' B2X('1 1111 0000') == '1F0'
Функция B2X( ) может использоваться вместе с функциями X2D( ) и X2C( ) для преобразования двоичного числа в число с другим представлением. Например: X2D(B2X('10111')) == '23' /* десятичное 23 */
BEEP
Функция BEEP подает звуковой сигнал на частоте (герц) с указанной длительностью (миллисекунд). Частота может быть любым числом в диапазоне от 37 до 32767 герц. Длительность может быть любым числом в диапазоне от 1 до 60000 миллисекунд.
Эта функция полезна в случае, когда ее вызывают как подпрограмму. Возвращенная пустая строка свидетельствует об успешном завершении функции.
Ниже приведен пример: /* C гамма */ note.1 = 262 /* среднее C */ note.2 = 294 /* D */ note.3 = 330 /* E */ note.4 = 349 /* F */ note.5 = 392 /* G */ note.6 = 440 /* A */ note.7 = 494 /* B */ note.8 = 524 /* C */
do i=1 to 8 call beep note.i,250 /* держит каждую ноту */ /* в течение четверти секунды */ end
BITAND
Функция BITAND в качестве результата возвращает строку, состоящую из двух логически объединенных вводных строк (бит за битом с помощью оператора логического И). Результирующая строка имеет длину, равную длине большей из двух объединяемых строк. Если символ-заполнитель не указан, то операция логического И завершается по достижении конца более короткой строки, и необработанная часть более длинной строки добавляется в конец результата. Если же символ-заполнитель указан, то перед выполнением логической операции более короткая строка расширяется путем добавления справа этого символа-заполнителя. По умолчанию в качестве строки2 принимается строка нулевой длины (пустая).
Ниже приведено несколько примеров: BITAND('73'x,'27'x) -> '23'x BITAND('13'x,'5555'x) -> '1155'x BITAND('13'x,'5555'x,'74'x) -> '1154'x BITAND('pQrS',,'DF'x) -> 'PQRS' /* только в ASCII */
BITOR
Функция BITOR в качестве результата возвращает строку, состоящую из двух логически объединенных вводных строк (бит за битом с помощью оператора логического ИЛИ). Результирующая строка имеет длину, равную длине большей из двух объединяемых строк. Если символ-заполнитель не указан, то операция логического ИЛИ завершается по достижении конца более короткой строки, и необработанная часть более длинной строки добавляется в конец результата. Если же символ-заполнитель указан, то перед выполнением логической операции более короткая строка расширяется добавлением справа этого символа-заполнителя. По умолчанию в качестве строки2 принимается строка нулевой длины (пустая).
Ниже приведено несколько примеров: BITOR('15'x,'24'x) -> '35'x BITOR('15'x,'2456'x) -> '3556'x BITOR('15'x,'2456'x,'F0'x) -> '35F6'x BITOR('1111'x,,'4D'x) -> '5D5D'x BITOR('pQrS',,'20'x) -> 'pqrs' /* только в ASCII */
BITXOR
Функция BITXOR в качестве результата возвращает строку, состоящую из двух логически объединенных вводных строк (бит за битом с помощью оператора исключающего ИЛИ). Результирующая строка имеет длину, равную длине большей из двух объединяемых строк. Если символ-заполнитель не указан, то операция исключающего ИЛИ завершается по достижении конца более короткой строки, и необработанная часть более длинной строки добавляется в конец результата. Если же символ-заполнитель указан, то перед выполнением логической операции более короткая строка расширяется путем добавления справа этого символа-заполнителя. По умолчанию в качестве строки2 принимается строка нулевой длины (пустая).
Ниже приведено несколько примеров: BITXOR('12'x,'22'x) -> '30'x BITXOR('1211'x,'22'x) -> '3011'x BITXOR('C711'x,'222222'x,' ') -> 'E53302'x /* ASCII */ BITXOR('1111'x,'444444'x) -> '555544'x BITXOR('1111'x,'444444'x,'40'x) -> '555504'x BITXOR('1111'x,,'4D'x) -> '5C5C'x
C2D (Символьное в десятичное)
Функция C2D в качестве результата возвращает десятичное значение двоичного представления указанной строки. Если результат не может быть представлен в виде целого числа, то выдается сообщение об ошибке. Результат не должен содержать больше цифр, чем определено в текущем назначении NUMERIC DIGITS.
Если указанная строка пустая, то в качестве результата возвращается 0.
Если не указано значение n, то строка обрабатывается как двоичное число без знака.
Ниже приведено несколько примеров: C2D('09'X) -> 9 C2D('81'X) -> 129 C2D('FF81'X) -> 65409 C2D('a') -> 97 /* ASCII */
Если значение n определено, то указанная строка заполняется слева символами 00х (без знака), или усекается слева до количества символов, равного значению n. Полученная строка из n шестнадцатеричных цифр рассматривается как двоичное число со знаком: положительное, если крайний левый бит сброшен (установлен в OFF), и отрицательное (в форме дополнения до двоичного числа два), если крайний левый бит установлен в ON. Если значение n равно 0, то в качестве результата всегда возвращается 0.
Ниже приведено несколько примеров: C2D('81'X,1) -> -127 C2D('81'X,2) -> 129 C2D('FF81'X,2) -> -127 C2D('FF81'X,1) -> -127 C2D('FF7F'X,1) -> 127 C2D('F081'X,2) -> -3967 C2D('F081'X,1) -> -127 C2D('0031'X,0) -> 0
Максимально допустимое значение: Вводная строка не может состоять более чем из 250 символов, которые будут значащими при формировании окончательного результата. Начальные символы, определяющие знак (00x и ffx), не учитываются в этом общем итоге.
C2X (Символьное в шестнадцатеричное)
Функция C2X преобразует строку, состоящую из символов, в строку, состоящую из шестнадцатеричного представления этих символов. Данные, которые требуется преобразовать, могут иметь любую длину. Строка, полученная в результате выполнения функции, может иметь длину, вдвое превышающую первоначальную, из-за литерального представления вводной строки.
Ниже приведено несколько примеров: C2X('0123'X) -> '0123' C2X('ZD8') -> '5A4438' /* ASCII */
CENTER/CENTRE
Функция CENTER или CENTRE возвращает строку указанной длины, содержащую центрированную вводную строку с символами-заполнителями, добавляемыми для увеличения длины, если это необходимо. По умолчанию символом-заполнителем является пробел. Если строка длиннее указанной длины, то она в равной мере усекается с обоих концов. Если добавляется или усекается нечетное количество символов, то справа усекается или добавляется на один символ больше, чем слева.
Ниже приведено несколько примеров: CENTER(abc,7) -> ' ABC ' CENTER(abc,8,'-') -> '--ABC---' CENTRE('The blue sky',8) -> 'e blue s' CENTRE('The blue sky',7) -> 'e blue '
Прим. | Данная функция может быть вызвана как по имени CENTRE, так и по имени CENTER. Это позволяет избежать синтаксических ошибок, которые могут возникнуть из-за различного написания слова 'ЦЕНТР' в английской и американской интерпретации. |
CHARIN
Функция CHARIN возвращает в качестве результата строку размером до указанной длины, состоящую из символов, прочитанных из вводного потока с указанным именем. Форма, в которой указывается имя, зависит от среды применения. Если имя опущено, то символы читаются из вводного потока STDIN:, определяемого по умолчанию. Длина, принимаемая по умолчанию, равна 1.
В устойчивых потоках позиция чтения ведется для каждого потока. В операционной системе OS/2 эта позиция та же, что и позиция записи. По умолчанию любое чтение из потока начинается с текущей позиции чтения. Когда чтение завершено, позиция чтения наращивается на величину прочитанных символов. Значение начала может быть указано для определения конкретной позиции чтения и должно быть целым положительным числом в пределах длины потока. Данная позиция чтения не может быть указана для переменных потоков (порт или другое последовательное устройство). Значение 1, указанное для начала, определяет первый символ в потоке.
Если значение длины задано равным нулю, то позиция чтения устанавливается по значению, указанному в начале, но символы не читаются и в качестве результата возвращается пустая строка.
В переменных потоках, если количество доступных символов меньше указанной длины, то выполнение программы временно приостанавливается до тех пор, пока достаточное количество символов не станет доступным. Если требуемое количество символов невозможно сделать доступным вследствие ошибки или других проблем, то будет сформировано условие NOTREADY и функция CHARIN вернет результирующую строку с количеством символов, меньшим, чем требовалось.
Ниже приведено несколько примеров: CHARIN(myfile,1,3) -> 'MFC' /* первые 3 */ /* символа */ CHARIN(myfile,1,0) -> '' /* в начало */ CHARIN(myfile) -> 'M' /* после последнего вызова */ CHARIN(myfile,,2) -> 'FC' /* после последнего вызова */
/* Чтение из вводного потока (здесь с клавиатуры) */ /* Пользователь вводит строку 'abcd efg' */ CHARIN( ) -> 'a' /* по умолчанию */ /* читается 1 символ */ CHARIN(,,5) -> 'bcd e'
Примечание 1:
Функция CHARIN в результирующую строку помещает все символы, встретившиеся во вводном потоке, включая символы перевода строки, возврата каретки и конца файла.
Примечание 2:
Если функция CHARIN используется для чтения с клавиатуры, то выполнение программы приостанавливается до тех пор, пока пользователь на нажмет клавишу Enter.
CHAROUT
Функция CHAROUT возвращает количество символов, оставшихся после попытки записать строку в выходной поток символов с указанным именем. Форма, в которой указывается имя, зависит от среды применения. Если имя опущено, то символы в строке будут записаны в выходной поток STDOUT: (обычно это дисплей), принимаемый по умолчанию в операционной системе OS/2. строка может быть пустой; в этом случае символы в выходной поток не записываются и в качестве результата всегда возвращается значение 0.
В устойчивых потоках позиция записи ведется для каждого потока. В операционной системе OS/2 эта позиция та же, что и позиция чтения. По умолчанию любая запись в выходной поток начинается с текущей позиции записи. Когда запись завершена, позиция записи наращивается на величину записанных символов. Первоначальной позицией записи является конец потока, поэтому обращение к функции CHAROUT обычно влечет за собой добавление символов в конец выходного потока.
Значение начала может быть указано для устойчивого потока, чтобы определить конкретную позицию записи, и должно быть целым положительным числом в пределах длины потока (хотя оно может указывать позицию символа, непосредственно следующего за последним символом данного потока). Значение 1, указанное для начала, определяет первый символ в потоке.
Прим. | В некоторых средах перезапись потока с помощью функций CHAROUT или LINEOUT может удалить (разрушить) все существующие данные в потоке. Однако это не относится к среде OS/2. |
Для устойчивых потоков значение режима строка может быть опущено. В этом случае позиция записи устанавливается равной значению, указанному в начале, символы в поток не записываются, и в качестве результата возвращается 0. Если ни Содержание, ни строка не указаны, то позиция записи устанавливается на конец потока. Подобное использование функции CHAROUT может иметь дополнительный эффект закрытия или фиксации файла в средах, поддерживающих данную концепцию. В качестве результата возвращается 0. Если Вы не укажете Содержание или строку, то поток закроется.
В качестве результата возвращается 0.
Выполнение программы обычно временно приостанавливается до тех пор, пока не завершится операция вывода. Однако если невозможно записать все требуемые символы, то будет сформировано условие NOTREADY, и функция CHAROUT в качестве результата вернет количество символов, которые не удалось записать (остаточное количество).
Ниже приведено несколько примеров: CHAROUT(myfile,'Hi') -> 0 /* как обычно */ CHAROUT(myfile,'Hi',5) -> 0 /* как обычно */ CHAROUT(myfile,,6) -> 0 /* сейчас в позиции 6 */ CHAROUT(myfile) -> 0 /* в конце потока */ CHAROUT(,'Hi') -> 0 /* как обычно */ CHAROUT(,'Hello') -> 2 /* может быть */
Прим. | Эту функцию зачастую лучше вызывать как подпрограмму. Остаточное количество символов в этом случае будет доступно в качестве значения переменной RESULT. |
CHARS
Функция CHARS в качестве результата возвращает общее количество символов, оставшихся во вводном потоке с указанным именем. Это количество включает в себя все символы-разделители, если они определены для данного потока; и в случае устойчивых потоков представляет собой количество символов, начиная с текущей позиции чтения до конца потока. Если имя опущено, то операционная система OS/2 будет использовать STDIN: в качестве значения по умолчанию.
Для некоторых потоков (например, STDIN) невозможно определить общее количество оставшихся символов. Для потоков такого рода функция CHARS в качестве результата возвращает 1 при наличии данных и 0 - при их отсутствия. Для устройств операционной системы OS/2 функция CHARS всегда возвращает результат 1.
Ниже приведено несколько примеров: CHARS(myfile) -> 42 /* возможно */ CHARS(nonfile) -> 0 /* возможно */ CHARS() -> 1 /* возможно */
COMPARE
Функция COMPARE в качестве результата возвращает 0, если строки строка1 и строка2 идентичны. В противном случае функция COMPARE в качестве результата возвращает позицию первого несовпадающего символа. При необходимости более короткая строка дополняется справа символами-заполнителями. По умолчанию в качестве символа-заполнителя используется пробел.
Ниже приведено несколько примеров: COMPARE('abc','abc') -> 0 COMPARE('abc','ak') -> 2 COMPARE('ab ','ab') -> 0 COMPARE('ab ','ab',' ') -> 0 COMPARE('ab ','ab','x') -> 3 COMPARE('ab-- ','ab','-') -> 5
CONDITION
Функция CONDITION в качестве результата возвращает информацию, связанную с условием, которое отслеживается в настоящий момент. Вы можете получить следующую информацию: Имя условия, которое отслеживается в настоящий момент Любую описательную строку, связанную с этим условием Инструкцию, выполненную как результат отслеживания условия (CALL или SIGNAL) Состояние отслеживаемого условия.
В функции CONDITION могут быть указаны следующие режимы (значащими являются только заглавные буквы режимов, остальные игнорируются):
Condition name | Возвращает имя условия, которое отслеживается в настоящий момент. |
Description | Возвращает любую описательную строку, связанную с условием, которое отслеживается в настоящий момент. Если описательные строки отсутствуют, то в качестве результата возвращается пустая строка. |
Instruction | Возвращает ключевое слово инструкции, выполнявшейся в момент обнаружения условия, которое отслеживается в настоящий момент. Ключевыми словами могут быть CALL или SIGNAL. Если Вы не укажете режим, то будет принят режим по умолчанию. |
Status | Возвращает состояние условия, которое отслеживается в настоящий момент. Оно может меняться в процессе выполнения и принимать следующие значения: |
ON - отслеживание условия включено | |
OFF - отслеживание условия выключено | |
DELAY - обработка любого последующего условия требуемого типа задерживается. |
Если нет условий, которые требуется отслеживать (т.е. не существует условия, которое отслеживается в настоящий момент), то функция CONDITION в качестве результата возвращает пустую строку для всех четырех режимов.
Ниже приведено насколько примеров: CONDITION() -> 'CALL' /* возможно */ CONDITION('C') -> 'FAILURE' CONDITION('I') -> 'CALL' CONDITION('D') -> 'FailureTest' CONDITION('S') -> 'OFF' /* возможно */
Прим. | Информация об условии, выдаваемая функцией CONDITION, в случае обращения процедуры к подпрограммам сохраняется и восстанавливается (включая информацию, получаемую по CALL ON). Поэтому, когда подпрограмма, вызванная по CALL ON, завершается, то условием, отслеживаемым в настоящий момент, становится то, которое имело место перед выполнением инструкции CALL. Функция CONDITION возвращает значения перед тем, как отслеживаемое условие было обнаружено. |
COPIES
Функция COPIES в качестве результата возвращает n связанных вместе копий указанной строки. n должно быть целым неотрицательным числом.
Ниже приведено несколько примеров: COPIES('abc',3) -> 'abcabcabc' COPIES('abc',0) -> ''
D2C (Десятичное в символьное)
Функция D2C в качестве результата возвращает символьную строку, являющуюся представлением десятичного числа в коде ASCII. Если Вы укажете n, то это значение будет являться длиной полученного символьного результата (при необходимости для достижения требуемой длины добавляются символы начальных нулей).
Если значение n не указано, то целое-число должно быть неотрицательным числом и результирующая строка имеет фактическую длину; поэтому возвращенный результат не содержит символов начальных нулей.
Ниже приведено несколько примеров: D2C(65) -> 'A' /* '41'x = 'A' в коде ASCII */ D2C(65,1) -> 'A' D2C(65,2) -> ' A' D2C(65,5) -> ' A' D2C(109) -> 'm' /* '6D'x = 'm' в коде ASCII */ D2C(-109,1) -> 'У' /* '147'x = 'У' в коде ASCII */ D2C(76,2) -> ' L' /* '76'x = ' L' в коде ASCII */ D2C(-180,2) -> ' L'
D2X (Десятичное в шестнадцатеричное)
Функция D2X в качестве результата возвращает строку шестнадцатеричных символов, которые являются шестнадцатеричным представлением десятичного числа.
Если значение n не указано, то целое-число должно быть неотрицательным числом и при этом возвращенный результат не содержит символов начальных нулей.
Если значение n определено, то оно представляет собой длину окончательного результата в символах; т.е. после преобразования исходной строки результат расширяется знаковым разрядом до требуемой длины. Если преобразованное число слишком велико, чтобы поместиться в указанные n символов, то оно усекается слева.
Ниже приведено несколько примеров: D2X(9) -> '9' D2X(129) -> '81' D2X(129,1) -> '1' D2X(129,2) -> '81' D2X(129,4) -> '0081' D2X(257,2) -> '01' D2X(-127,2) -> '81' D2X(-127,4) -> 'FF81' D2X(12,0) -> ''
Максимально возможное значение: Результирующая выводная строка не может состоять более чем из 250 значащих шестнадцатеричных символов, хотя возможно получение более длинной строки результата за счет добавочных начальных символов, определяющих знак (0 и F).
DATATYPE
Функция DATATYPE определяет, являются ли 'данные' цифровыми или алфавитными, и в качестве результата возвращает соответственно NUM или CHAR. Если из параметров указана только строка, то DATATYPE в качестве результата возвращает NUM (если строка представляет собой число (в любом формате), действительное для REXX); в противном случае результатом будет CHAR.
Если указан тип, то результат будет равен 1 (если тип символов в строке совпадает с требуемым); в противном случае результат будет равен 0. Если указана пустая строка, то в качестве результата возвращается 0 (исключая случаи, когда типом является X, что влечет за собой возврат результата 1). Ниже приведен список типов, действительных для функции DATATYPE. Следует отметить, что только заглавные буквы в указанных типах являются значащими (все остальные игнорируются).
Alphanumeric | Возвращает 1, если указанная строка содержит только те символы, которые находятся в диапазонах a-z, A-Z и 0-9. |
Bits | Возвращает 1, если указанная строка содержит только символы 0 и/или 1. |
C | Возвращает 1, если указанная строка является смешанной строкой, состоящей из символов SBCS/DBCS. |
Dbcs | Возвращает 1, если указанная строка является чистой строкой DBCS. |
Lowercase | Возвращает 1, если указанная строка содержит только те символы, которые находятся в диапазоне a-z. |
Mixed case | Возвращает 1, если указанная строка содержит только те символы, которые находятся в диапазонах a-z и A-Z. |
Number | Возвращает 1, если указанная строка является числом, действительным для REXX. |
Symbol | Возвращает 1, если указанная строка содержит только лишь те символы, которые действительны для REXX. Заметим, что допустимо указание как строчных, так и прописных букв. |
Uppercase | Возвращает 1, если указанная строка содержит только те символы, которые находятся в диапазоне A-Z. |
Whole number | Возвращает 1, если указанная строка является целым числом (по правилам REXX) по текущему назначению NUMERIC DIGITS. |
heXadecimal | Возвращает 1, если указанная строка содержит только те символы, которые находятся в диапазонах a-f, A-F, 0-9 и пробел (в случаях, когда пробелы появляются между парами шестнадцатеричных символов). Возвращает 1 и в том случае, если указанная строка является пустой. |
DATE
Функция DATE по умолчанию возвращает текущую дату в следующем формате: дд мес гггг (например, "27 Авг 1988") без указания начального нуля или пробела перед числом, которое определяет день. Для мес используются три первых буквы русского названия месяца.
Для получения текущей даты в альтернативном формате можно использовать следующие режимы (при указании которых значащими являются только заглавные буквы, остальные игнорируются):
Basedate | Возвращает количество полных дней (т.е. не включая текущий день), начиная от базовой даты (Январь 1, 0001) и включая ее. Результат выдается в следующем формате: дддддд (без начальных нулей). Функция, заданная в виде DATE(B)//7, в качестве результата возвращает число из диапазона 0-6, где 0 соответствует Понедельнику и 6 - Воскресенью.
| |||
Days | Возвращает количество дней (включая текущий), прошедших с начала настоящего года, в следующем формате: ддд (без начальных нулей) | |||
European | Возвращает дату в следующем формате: дд/мм/гг. | |||
Language | Возвращает дату в формате, зависящем от языка и реализации, либо в формате текущей даты. В операционной системе OS/2 формат Language имеет следующий вид: дд Месяц гггг. Если недоступен ни один текущий формат, то дата возвращается в формате, принятом по умолчанию.
| |||
Month | Возвращает полное русское название текущего месяца, например, "Август" | |||
Normal | Возвращает дату в формате, принятом по умолчанию: дд мес гггг | |||
Ordered | Возвращает дату в формате: гг/мм/дд (удобно для сортировки и т.п.) | |||
Sorted | Возвращает дату в формате: ггггммдд (удобно для сортировки и т.п.) | |||
Usa | Возвращает дату в формате: мм/дд/гг | |||
Weekday | Возвращает русское название дня недели, выдаваемое на смешанном регистре. Например, |
Прим. | Первое обращение к функции DATE или TIME в одном выражении приводит к тому, что создается временной штамп, который затем используется при всех обращениях к этим функциям в данном выражении. Поэтому, когда в одном выражении к функциям DATE и/или TIME обращаются несколько раз, то их согласованность друг с другом гарантируется. |
DELSTR (Удаление строки)
Функция DELSTR удаляет из указанной строки подстроку, которая начинается с n-ного символа и имеет указанную длину. Если длина не определена, то удаляется остаток строки. Если значение n больше, чем длина указанной строки, то результирующая строка возвращается неизмененной. Значение n должно быть целым положительным числом.
Ниже приведено несколько примеров: DELSTR('abcd',3) -> 'ab' DELSTR('abcde',3,2) -> 'abe' DELSTR('abcde',6) -> 'abcde'
DELWORD
Функция DELWORD удаляет из указанной строки подстроку, которая начинается с n-ного слова. В качестве длины указывается число слов, разделенных между собой пробелами. Если длина не определена, то по умолчанию удаляется остаток слов в строке. Значение n должно быть целым положительным числом. Если значение n больше, чем количество слов в строке, то строка возвращается неизмененной. Удаленная строка включает в себя все пробелы, следующие за последним удаляемым словом.
Ниже приведено несколько примеров: DELWORD('Now is the time',2,2) -> 'Now time' DELWORD('Now is the time ',3) -> 'Now is ' DELWORD('Now is the time',5) -> 'Now is the time'
DIGITS
Функция DIGITS возвращает текущее назначение NUMERIC DIGITS.
Ниже приведен пример: DIGITS() -> 9 /* по умолчанию */
DIRECTORY
Функция DIRECTORY в качестве результата возвращает имя текущего каталога, если функция используется без параметров; и изменяет имя текущего каталога на новый-каталог, если аргумент указан и каталог с указанным именем существует.
Возвращенная результирующая строка включает в себя префикс буквы устройства в качестве первых двух символов имени каталога. Указание префикса буквы устройства как части значения нового-каталога приводит к тому, что указанное устройство становится текущим. Если буква устройства не указана, то текущее устройство остается неизменным.
Например, в приведенном ниже фрагменте процедуры сохраняется имя текущего каталога и происходит переключение на новый каталог. В этом каталоге выполняются некоторые действия, а затем осуществляется возврат к старому каталогу. /* получить текущий каталог */ curdir = directory() /* поиграть в игру */ newdir = directory("d:/usr/games") if newdir = "d:/usr/games" then do fortune /* вызов игры */ /* возврат к старому каталогу */ call directory curdir end else say 'Невозможно найти /usr/games'
ENDLOCAL
Функция ENDLOCAL восстанавливает каталог и переменные среды, которые были активны перед последним выполнением функции SETLOCAL. Если функция ENDLOCAL не включена в процедуру, то при выходе из процедуры восстанавливается исходная среда, сохраненная функцией SETLOCAL.
ENDLOCAL в качестве результата возвращает значение 1, если исходная среда успешно восстановлена, и значение 0, если восстановление прошло неуспешно, либо функция SETLOCAL предварительно не выдавалась.
Прим. | В отличие от своих двойников в языке команд OS/2 (операторы Setlocal и Endlocal), функции языка REXX SETLOCAL и ENDLOCAL могут быть вложенными. |
Ниже приведен пример: n = SETLOCAL() /* сохраняет имя текущей среды */
/* Теперь программа изменяет переменные */ /* среды (с помощью функции VALUE) и затем */ /* работает в измененной среде. */
n = ENDLOCAL() /* восстанавливает текущую среду */
Для просмотра дополнительных примеров обратитесь к описанию функции SETLOCAL.
ERRORTEXT
Функция ERRORTEXT в качестве результата возвращает сообщение об ошибке, которое соответствует указанному номеру n. Значение n должно быть в пределах от 0 до 99; указание любого другого значения является ошибкой. Если указанное значение n находится в допустимом диапазоне, но для него не определено никакое сообщение об ошибке языка REXX, то в качестве результата возвращается пустая строка.
Ниже приведено несколько примеров: ERRORTEXT(16) -> 'Метка не найдена' ERRORTEXT(60) -> ''
FILESPEC
Функция FILESPEC в качестве результата возвращает выбранный элемент из указанной спецификации-файла. Выбор элемента осуществляется в соответствии с указанным режимом, перечень которых приведен ниже:
Drive | Возвращает букву устройства для файла с указанной спецификацией-файла. |
Path | Возвращает путь через каталоги для файла с указанной спецификацией-файла. |
Name | Возвращает имя файла для указанной спецификации-файла. |
Если запрашиваемая строка не найдена, то в качестве результата функция FILESPEC возвращает пустую строку (" ").
Прим. | При задании режима значащей будет только первая буква, остальные игнорируются. |
Ниже приведено несколько примеров: thisfile = "C:\OS2\UTIL\EXAMPLE.EXE" say FILESPEC("drive",thisfile) /* выведет "C:" */ say FILESPEC("path",thisfile) /* выведет "\OS2\UTIL\" */ say FILESPEC("name",thisfile) /* выведет "EXAMPLE.EXE" */
part = "name" say FILESPEC(part,thisfile) /* выведет "EXAMPLE.EXE" */
FORM
Функция FORM в качестве результата возвращает текущее назначение NUMERIC FORM.
Ниже приведен пример: FORM() -> 'SCIENTIFIC' /* по умолчанию */
FORMAT
Функция FORMAT в качестве результата возвращает число, округленное и форматированное.
Указанное число сначала округляется и форматируется в соответствии со стандартными правилами языка REXX, как если бы была выполнена операция число+0. Если указано только число, то результат будет в точности равен результату данной операции. Если указан какой-либо режим, то число форматируется в соответствии с правилами, оговоренными для каждого режима.
Режимы до и после указывают, сколько позиций должно использоваться для записи соответственно целой и дробной части результата. Если оба этих режима или какой-либо из них опущен, то результат возвращается таким, каков он на самом деле.
Если указанное значение режима до недостаточно велико, чтобы вместить целую часть числа, то выдается сообщение об ошибке. Если же значение до слишком велико, то целая часть числа дополняется слева пробелами. В случаях, когда указанное значение режима после не совпадает с размером десятичной части числа, число округляется до требуемого количества знаков или дополняется справа нулями. Если же в качестве значения данного режима указывается 0, то число округляется до целого.
Ниже приведено несколько примеров: FORMAT('3',4) -> ' 3' FORMAT('1.73',4,0) -> ' 2' FORMAT('1.73',4,3) -> ' 1.730' FORMAT('-.76',4,1) -> ' -0.8' FORMAT('3.03',4) -> ' 3.03' FORMAT(' - 12.73',,4) -> '-12.7300' FORMAT(' - 12.73') -> '-12.73' FORMAT('0.000') -> '0'
Первые три режима описаны выше. Режимы expp и expt управляют выводом результата в экспоненциальной форме: expp указывает число позиций, требующихся для написания показателя степени; по умолчанию используется столько, сколько нужно. expt устанавливает точку отсчета для представления результата в экспоненциальной форме. Если количество позиций целой части числа превышает значение expt, то используется экспоненциальная форма представления результата. Экспоненциальная форма используется и тогда, когда количество позиций, требующихся для записи десятичной части числа, вдвое превышает значение expt.
Синтаксис Вы можете включить вызов функции в выражение, расположенное во внутренней или внешней программе в любом месте, где могут использоваться данные (например, строка). Вызов функции осуществляется по следующей схеме:
По умолчанию принимается текущее назначение NUMERIC DIGITS. Если в качестве значения expt указан 0, то экспоненциальная форма записи результата будет использоваться всегда, несмотря на то, что показатель степени может быть равен 0. Значение expp должно быть меньше 10, а на остальные режимы ограничений не существует. Если в качестве значения expp указан 0, то экспоненциальная форма представления результата не используется, и число записывается в простой форме с дополнительными нулями, если это необходимо (отменяет значение 0 режима expt). Однако, если значение expp не настолько велико, чтобы вместить требуемый показатель степени, то выдается сообщение об ошибке. Если же показатель степени равен 0, то в этом случае (при ненулевом значении expp) для записи экспоненциальной части результата используется expp+2 пробела.
Ниже приведено несколько примеров: FORMAT('12345.73',,,2,2) -> '1.234573E+04' FORMAT('12345.73',,3,,0) -> '1.235E+4' FORMAT('1.234573',,3,,0) -> '1.235' FORMAT('12345.73',,,3,6) -> '12345.73' FORMAT('1234567e5',,3,0) -> '123456700000.000'
Функции
Имя-функции представляет собой текстовую строку или единственный символ, которые являются константами.
В скобках можно указать до 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), который поддерживает системно-зависимые интерфейсы, используемые языковым процессором для ее вызова. Следует напомнить, что внешняя программа, вызванная как функция, должна вернуть результаты данные вызывающей программе. |
Функции API
Следующие встроенные функции REXX можно использовать в процедурах REXX для регистрации, освобождения или опроса пакетов внешних функций, а также для создания и манипуляции очередями внешних данных.
RXFUNCADD
RXFUNCADD регистрирует функцию с указанным именем и делает ее доступной для процедур REXX. Код возврата, равный 0, свидетельствует об успешной регистрации.
RXFUNCDROP
RXFUNCDROP перемещает (удаляет) функцию с указанным именем из списка доступных функций. Код возврата, равный 0, свидетельствует об успешном удалении.
RXFUNCQUERY
RXFUNCQUERY запрашивает список доступных функций для регистрации функции с указанным именем. Код возврата, равный 0, свидетельствует о регистрации функции; код возврата, равный 1, свидетельствует о том, что функция не зарегистрирована.
RXQUEUE
RXQUEUE используется в процедурах REXX для создания и удаления очередей внешних данных, а также для установления и опроса имен этих очередей.
Примечания:
Вызов внешней программы REXX как функции аналогичен вызову внутренней программы. Однако внешняя программа является неявной ПРОЦЕДУРОЙ, в которой всегда удаляются все переменные вызывающей программы и состояние внутренних значений (назначения NUMERIC и т.д.) принимается по умолчанию (а не передаются из вызывающей программы).
Другие программы REXX могут быть вызваны как функции. Вы можете использовать инструкции EXIT или RETURN для выхода из вызванной программы REXX; в любом случае нужно указать выражение.
Порядок просмотра
Порядок поиска функций аналогичен порядку их описания в этом разделе. Внутренние метки имеют наивысший приоритет, затем следуют встроенные функции, а последними идут внешние функции.
Внутренние метки не могут использоваться, если имя функции подается в качестве строки (указано в кавычках); в этом случае функция должна быть встроенной или внешней. Это позволяет Вам захватить имя, например, встроенной функции и расширить ее возможности; при этом исходную функцию можно при необходимости продолжать вызывать как встроенную.
Пример: /* Модифицированная DATE, выдающая по умолчанию отсортированную дату */ date: procedure arg in if in='' then in='Sorted' return 'DATE'(in)
Встроенные функции имеют имена, набранные прописными буквами. Для успешного поиска встроенной функции имя в текстовой строке должно быть указано прописными буквами, как это показано в предыдущем примере. Это справедливо и для внешних функций.
Внешние функции и подпрограммы имеют системно-зависимый порядок поиска.
REXX осуществляет поиск внешних функций в следующем порядке:
Функции, которые были загружены в макропространство для внеочередного выполнения Функции, являющиеся частью пакета функций Функции REXX, расположенные в текущем каталоге, с текущим расширением Функции REXX, расположенные по пути, заданному переменной среды PATH, с текущим расширением Функции REXX, расположенные в текущем каталоге, со стандартным расширением Функции REXX, расположенные по пути, заданному переменной среды PATH, со стандартным расширением Функции, которые были загружены в макропространство для выполнения в последнюю очередь.
Ошибки во время выполнения
Если внешняя или встроенная функция обнаруживает ошибку любого рода, то она извещает языковый процессор и выдает сообщение о синтаксической ошибке. При этом завершается обработка предложения, содержащего вызов функции. Аналогично, если внешней функции не удается правильно выдать результирующие данные, то это также обнаруживается языковым процессором и фиксируется как ошибка.
Если синтаксическая ошибка происходит в процессе выполнения внешней функции, то эту ошибку можно отследить (с помощью 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 предлагает широкий выбор встроенных функций. Среди них есть функции для работы с символами, функции преобразования и информационные функции.
Ниже приведены общие замечания, касающиеся встроенных функций:
Указание скобок при вызове функции всегда обязательно, даже если для данной конкретной функции не нужны аргументы. Первая скобка должна следовать непосредственно за именем функции без пробела между ними.
Встроенные функции выполняются с внутренним назначением NUMERIC DIGITS 9 и NUMERIC FUZZ 0 и не подвержены назначениям NUMERIC, за исключением специально оговоренных случаев.
Вы можете указать пустую строку там, где имеется ссылка на строку.
Если аргумент представляет собой длину, то он должен быть неотрицательным целым числом. Если аргумент указывает начальный символ или слово в строке, то он должен быть положительным целым числом, за исключением особо оговоренных случаев.
Если последний аргумент необязателен, то Вы можете указать вместо него запятую, чтобы обозначить его отсутствие; например, DATATYPE(1,) и DATATYPE(1) будут выполняться совершенно аналогично.
Если Вы указываете символ-заполнитель, то его длина не должна превышать длину одного символа.
Если у функции есть подрежимы, которые Вы можете выбрать, указывая первый символ строки, то этот символ может быть записан строчными или прописными буквами.
Преобразование между символьным и шестнадцатеричным видом влечет за собой машинное представление символьных строк, поэтому машины, работающие в кодах ASCII и EBCDIC, возвращают соответственно различные результаты.
Некоторые функции, описанные в этом разделе, поддерживают набор двухбайтовых символов (DBCS). Список таких функций приведен в документе Язык процедур 2/REXX для OS/2. Справочник.
FUZZ
Функция FUZZ в качестве результата возвращает текущее назначение NUMERIC FUZZ.
Ниже приведен пример: FUZZ() -> 0 /* по умолчанию */
INSERT
Функция INSERT вставляет новую строку, дополненную символами-заполнителями до требуемой длины, в целевую строку после n-ного символа. Если значение n определено, то оно должно быть неотрицательным целым числом. Если значение n больше длины целевой строки, то данная строка также будет расширена до требуемой длины с помощью символов-заполнителей. По умолчанию символом-заполнителем является пробел. Значением по умолчанию для режима n является 0, что означает вставку новой строки перед началом целевой.
Ниже приведено несколько примеров: INSERT(' ','abcdef',3) -> 'abc def' INSERT('123','abc',5,6) -> 'abc 123 ' INSERT('123','abc',5,6,'+') -> 'abc++123+++' INSERT('123','abc') -> '123abc' INSERT('123','abc',,5,'-') -> '123--abc'
LASTPOS
Функция LASTPOS в качестве результата возвращает позицию последнего появления одной строки, строки-поиска, в другой, целевой-строке. Если строка-поиска не найдена в указанной строке, то в качестве результата возвращается 0. По умолчанию поиск начинается с последнего символа целевой-строки (т.е. начало=LENGTH(строка)) и строка просматривается в обратном направлении. Вы можете отменить просмотр, выполняемый по умолчанию, указав значение для режима Содержание, что будет воспринято в качестве точки, с которой начнется обратный просмотр строки. Значение режима Содержание должно быть положительным целым числом или приравниваться к значению LENGTH(строка) в случае, если указанное значение превышает длину целевой строки.
Ниже приведено несколько примеров: LASTPOS(' ','abc def ghi') -> 8 LASTPOS(' ','abcdefghi') -> 0 LASTPOS(' ','abc def ghi',7) -> 4
LEFT
Функция LEFT в качестве результата возвращает строку указанной длины, содержащую крайние левые символы в количестве, определенном длиной, выбранные из указанной строки. Возвращенная результирующая строка при необходимости дополняется справа символами-заполнителями (или усекается). По умолчанию символом-заполнителем является пробел. Значение длины должно быть неотрицательным. Функция LEFT в точности эквивалентна следующей функции SUBSTR(строка,1,длина[,символ]).
Ниже приведено несколько примеров: LEFT('abc d',8) -> 'abc d ' LEFT('abc d',8,'.') -> 'abc d...' LEFT('abc def',7) -> 'abc de'
LENGTH
Функция LENGTH в качестве результата возвращает длину указанной строки.
Ниже приведено несколько примеров: LENGTH('abcdefgh') -> 8 LENGTH('abc defg') -> 8 LENGTH('') -> 0
LINEIN
Функция LINEIN в качестве результата возвращает содержимое некоторого количества (0 или 1) строк, прочитанных из вводного потока символов с указанным именем. Форма имени зависит от среды применения. Если имя опущено, то строка считывается из вводного потока, принимаемого по умолчанию; в операционной системе OS/2 это STDIN:. Режим количество по умолчанию принимает значение 1.
В устойчивых потоках позиция чтения ведется для каждого потока. В операционной системе OS/2 эта позиция та же, что и позиция записи. По умолчанию любое чтение из потока начинается с текущей позиции чтения. Обращение к функции LINEIN может привести к возврату только лишь части строки, если текущая позиция чтения не установлена на начало строки. После завершения чтения позиция чтения перемещается на начало следующей строки. Позиция чтения может быть установлена на начало потока с помощью указания значения 1 для режима строка. Значение 1 - единственное действительное значение для режима строка в операционной системе OS/2.
Если значение режима количество равно 0, то символы из вводного потока не читаются и в качестве результата возвращается пустая строка.
В переменных потоках при отсутствии возможности прочитать из вводного потока полную строку выполнение программы временно приостанавливается до тех пор, пока строка не заполнится. Если заполнение строки невозможно вследствие ошибки или других проблем, то формируется условие NOTREADY, и функция LINEIN возвращает результирующую строку, содержащую столько символов, сколько удалось прочитать.
Ниже приведено несколько примеров: LINEIN() /* Считывает одну строку из */ /* входного потока, принимае- */ /* мого по умолчанию; обычно */ /* это клавиатура */
myfile = 'ANYFILE.TXT' LINEIN(myfile) -> 'Текущая строка' /* Считывает одну строку */ /* файла ANYFILE.TXT, начиная */ /* с текущей позиции чтения. */ /* (При первом обращении */ /* файл открывается и считы- */ /* вается первая строка) */
LINEIN(myfile,1,1) ->'Первая строка' /* Открывает и считывает */ /* первую строку файла */ /* ANYFILE.TXT (если файл уже */ /* открыт, считывает первую */ /* строку); позиция чтения */ /* устанавливается на вторую строку */
LINEIN(myfile,1,0) -> '' /* Чтение отсутствует; открывает ANYFILE.TXT */ /* (если файл уже открыт, */ /* устанавливает позицию */ /* чтения на первую строку) */
LINEIN(myfile,,0) -> '' /* Чтение отсутствует; открывает ANYFILE.TXT */ /* ( если файл уже открыт, ни- */ /* какие действия не выполняются) */
LINEIN("QUEUE:") -> 'Строка из очереди' /* Считывает строку из очереди; */ /* Если очередь пуста, то про- */ /* грамма ожидает до тех пор, */ /* пока строка не будет помещена в очередь */
Прим. | Если Вы хотите считывать полные строки из вводного потока, определенного по умолчанию, как, например, при обычном диалоге с пользователем, то для простоты и возможности улучшенного программирования целесообразно использовать вместо функции LINEIN инструкции PULL или PARSE PULL. В некоторых случаях полезно также использовать инструкцию PARSE LINEIN. |
LINEOUT
Функция LINEOUT в качестве результата возвращает количество строк, оставшихся после попытки записать строку в выводной поток символов с указанным именем. Значение результата может быть равно 0 (если строка была записана успешно) или 1 (если в процессе записи строки произошла какая-либо ошибка). В качестве строки может быть указана пустая строка, в этом случае будут выполнены только те действия, которые связаны с завершением строки. Функция LINEOUT добавляет в конец строки символы конца строки и возврата каретки.
Форма имени зависит от среды применения. Если имя опущено, то строка записывается в выводной поток, принимаемый по умолчанию. В операционной системе OS/2 это STDOUT: (обычно экран дисплея).
В устойчивых потоках позиция записи ведется для каждого потока. В операционной системе OS/2 эта позиция та же, что и позиция чтения. По умолчанию любая запись в выводной поток начинается с текущей позиции записи. Символы, записанные с помощью обращения к функции LINEOUT, могут быть добавлены к частичной строке. Функция LINEOUT концептуально завершает строку в конце каждого обращения к ней. После завершения записи позиция записи устанавливается на начало строки, непосредственно следующей за записанной. Исходной позицией записи является конец потока, т.е. обычно обращение к функции LINEOUT приводит к добавлению строк в конец выводного потока.
Вы можете установить позицию записи на первый символ устойчивого потока, указав для режима линия значение 1 (единственное действительное значение).
Прим. | В некоторых средах перезапись потока с помощью функций CHAROUT или LINEOUT может удалить (разрушить) все существующие данные в потоке. Однако это не относится к среде OS/2. |
Для устойчивых потоков значение режима строка может быть опущено. Если Вы указываете режим линия, то позиция записи устанавливается на начало потока, но в выводной поток ничего не записывается и в качестве результата возвращается 0. Если же ни линия, ни строка не указаны, то позиция записи устанавливается на конец потока.
Подобное использование функции LINEOUT имеет дополнительный эффект закрытия потока в средах (таких как OS/2), поддерживающих данную концепцию.
Выполнение программы обычно временно приостанавливается до тех пор, пока не завершится операция вывода. Однако если строка не может быть записана, то формируется условие NOTREADY, и функция LINEOUT в качестве результата возвращает значение 1 (что свидетельствует о наличии остаточного счетчика при записи строк).
Ниже приведено несколько примеров: LINEOUT(,'Display this') /* Записывает строку в выходной */ /* поток,принимаемый по умолчанию */ /* (обычно, это дисплей); возвра- */ /* щает 0, если действие успешно. */
myfile = 'ANYFILE.TXT' LINEOUT(myfile,'A new line') /* Открывает файл ANYFILE.TXT и */ /* добавляет строку в конец файла.*/ /* Если файл уже открыт, строка */ /* записывается в текущую позицию */ /* записи. Возвращает 0, если */ /* действие прошло успешно. */
LINEOUT(myfile,'A new start',1)/* Открывает файл (если он еще не */ /* открыт); записывает новую стро-*/ /* ку на место первой. Возвращает */ /* 0, если действие прошло успешно*/
LINEOUT(myfile,,1) /* Открывает файл (если он еще не открыт); */ /* запись не выполняется. Позиция записи */ /* устанавливается на первый символ. */
LINEOUT(myfile) /* Закрывает файл ANYFILE.TXT */
Функцию LINEOUT полезно вызывать как подпрограмму. В этом случае результат ее выполнения доступен в качестве значения переменной RESULT. Например: Call LINEOUT 'A:rexx.bat','Shell',1 Call LINEOUT ,'Hello'
Прим. | Если строки должны быть записаны в выводной поток символов, принимаемый по умолчанию, без возможности возникновения ошибки, то вместо функции LINEOUT используйте инструкцию SAY. |
LINES
Функция LINES в качестве результата возвращает 1, если между текущей позицией чтения и концом вводного потока символов с указанным именем находятся некоторые данные, и 0, если данные в этом промежутке отсутствуют. В действительности функция LINES дает информацию о том, будет ли успешным чтение из вводного потока, выполняемое функциями CHARIN или LINEIN.
Форма имени зависит от среды применения. Если имя опущено, то проверяется наличие или отсутствие данных во вводном потоке, принимаемом по умолчанию (STDIN:). Для устройств OS/2 функция LINES в качестве результата всегда возвращает значение 1.
Ниже приведено несколько примеров: LINES(myfile) -> 0 /* в конце файла */
LINES() -> 1 /* данные, оставшиеся */ /* во вводном потоке STDIN:, */ /* принимаемом по умолчанию */
LINES("COM1:") -> 1 /* Для устройств OS/2 */ /* всегда возвращается '1' */
Прим. | Функция CHARS в качестве результата возвращает количество символов, оставшихся в устойчивом потоке, либо результат, свидетельствующий о наличии либо отсутствии данных в переменном потоке. |
MAX
Функция MAX в качестве результата возвращает наибольшее число из указанного списка чисел, форматированное в соответствии с текущим назначением NUMERIC DIGITS. В списке можно указать до 20 чисел, а также использовать вложенное обращение к функции MAX, если нужно указать большее количество аргументов.
Ниже приведено несколько примеров: MAX(12,6,7,9) -> 12 MAX(17.3,19,17.03) -> 19 MAX(-7,-3,-4.3) -> -3 MAX(1,2,3,4,5,6,7,8,9,MAX(10,11,12,13)) -> 13
MIN
Функция MIN в качестве результата возвращает наименьшее число из указанного списка чисел, форматированное в соответствии с текущим назначением NUMERIC DIGITS. В списке можно указать до 20 чисел, а также использовать вложенное обращение к функции MIN, если нужно указать большее количество аргументов.
Ниже приведено несколько примеров: MIN(12,6,7,9) -> 6 MIN(17.3,19,17.03) -> 17.03 MIN(-7,-3,-4.3) -> -7
OVERLAY
Функция OVERLAY в качестве результата возвращает указанную целевую строку, которая, начиная с n-ного символа, перекрыта новой строкой, дополненной символами-заполнителями или усеченной до требуемой длины. Если значение длины указано, то оно должно быть положительным числом или нулем. Если значение n больше длины целевой строки, то символы-заполнители добавляются перед новой строкой. По умолчанию символом-заполнителем является пробел; значение n, принимаемое по умолчанию, равно 1. Если значение n указано, то оно должно быть целым положительным числом.
Ниже приведено несколько примеров: OVERLAY(' ','abcdef',3) -> 'ab def' OVERLAY('.','abcdef',3,2) -> 'ab. ef' OVERLAY('qq','abcd') -> 'qqcd' OVERLAY('qq','abcd',4) -> 'abcqq' OVERLAY('123','abc',5,6,'+') -> 'abc+123+++'
POS
Функция POS в качестве результата возвращает номер позиции одной строки, строки-поиска, в другой, целевой-строке. (Смотрите также описание функции LASTPOS.) Если строка-поиска не найдена в указанной строке, то в качестве результата возвращается 0. По умолчанию поиск начинается с первого символа целевой-строки (т.е. значение начала равно 1). Вы можете отменить просмотр, выполняемый по умолчанию, указав значение для режима Содержание (которое должно быть целым положительным числом) в качестве точки, с которой начнется просмотр строки.
Ниже приведено несколько примеров: POS('day','Saturday') -> 6 POS('x','abc def ghi') -> 0 POS(' ','abc def ghi') -> 4 POS(' ','abc def ghi',5) -> 8
QUEUED
Функция QUEUED в качестве результата возвращает количество строк, оставшихся в активной очереди данных REXX на момент вызова функции.
Ниже приведен пример: QUEUED() -> 5 /* Возможно */
RANDOM
Функция RANDOM в качестве результата возвращает псевдослучайное целое неотрицательное число в диапазоне от min до max включительно. Если указан только один аргумент, то диапазон считается от 0 до указанного числа. Значения по умолчанию для аргументов min и max - 0 и 999 соответственно. Для случайного числа в качестве третьего аргумента может быть указано специальное начальное-число (которое должно быть целым числом), если нужно получать повторяемые результаты.
Величина диапазона (т.е. max - min) не должна превышать 100000.
Ниже приведено несколько примеров: RANDOM() -> 305 RANDOM(5,8) -> 7 RANDOM(,,1983) -> 123 /* воспроизводимо */ RANDOM(2) -> 0
Замечания: Чтобы получить предсказуемую последовательность псевдослучайных чисел, используйте функцию RANDOM несколько раз, но при этом указание начального-числа требуется только при первом использовании. Например, чтобы смоделировать 40 бросков шестигранной игральной кости, можно использовать следующий фрагмент процедуры: sequence = RANDOM(1,6,12345) /* любое число может быть исполь- */ /* зовано в качестве начального */ do 39 sequence = sequence RANDOM(1,6) end say sequence
Числа генерируются математически, используя начальное-число, так что до определенной степени их появление можно назвать случайным. Повторное выполнение программы приведет к генерации точно такой же последовательности; использование другого значения для начального-числа почти наверняка повлечет за собой генерацию другой последовательности псевдослучайных чисел. Генератор случайных чисел является глобальным для всей программы; текущее назначение начального числа не сохраняется в процессе обращений к внутренним программам. Генератор случайных чисел, используемый в действительности, может иметь отличия в различных средах применения.
REVERSE
Функция REVERSE в качестве результата возвращает строку, в которой все символы записаны с точностью до наоборот.
Ниже приведено несколько примеров: REVERSE('ABc.') -> '.cBA' REVERSE('XYZ ') -> ' ZYX'
RIGHT
Функция RIGHT в качестве результата возвращает строку указанной длины, содержащую крайние правые символы в количестве, определенном длиной, выбранные из указанной строки. Возвращенная результирующая строка при необходимости дополняется слева символами-заполнителями (или усекается). По умолчанию символом-заполнителем является пробел. Значение длины должно быть неотрицательным.
Ниже приведено несколько примеров: RIGHT('abc d',8) -> ' abc d' RIGHT('abc def',5) -> 'c def' RIGHT('12',5,'0') -> '00012'
SETLOCAL
Функция SETLOCAL сохраняет текущее рабочее устройство и каталог, а также текущие значения переменных среды OS/2, которые являются локальными для процесса, выполняющегося в настоящий момент.
Например, функцию SETLOCAL можно использовать для сохранения назначений текущей среды перед изменением выбранных назначений с помощью функции VALUE. Для восстановления устройства, каталога и среды используйте функцию ENDLOCAL.
Функция SETLOCAL в качестве результата возвращает значение 1, если исходные устройство, каталог и среда успешно сохранены, и значение 0, если сохранение прошло неуспешно. Если в процедуре за функцией SETLOCAL не следует ENDLOCAL, то на выходе из процедуры восстанавливается исходная среда, сохраненная с помощью функции SETLOCAL.
Ниже приведен пример: /* текущий путь: 'C:\PROJ\FILES' */ n = SETLOCAL() /* сохраняет все назначения среды */
/* Использование функции VALUE для изменения переменной PATH */ p = VALUE('Path','C:\PROC\PROGRAMS'.'OS2ENVIRONMENT')
/* Могут выполняться программы из каталога C:\PROC\PROGRAMS */
n = ENDLOCAL() /* восстанавливает исходную среду (включая */ /* измененную переменную PATH, которая опять */ /* имеет значение 'C:\PROJ\FILES') */
Прим. | В отличие от своих двойников в языке команд OS/2 (операторы Setlocal и Endlocal), функции языка REXX SETLOCAL и ENDLOCAL могут быть вложенными. |
SIGN
Функция SIGN в качестве результата возвращает число, которое определяет знак указанного числа. Значение числа сначала округляется в соответствии со стандартными правилами языка REXX так, как если бы была выполнена операция число+0. Если указанное число меньше нуля, то в качестве результата возвращается значение -1; если оно равно нулю, то возвращается 0, а если больше нуля, то возвращается 1.
Ниже приведено несколько примеров: SIGN('12.3') -> 1 SIGN(' -0.307') -> -1 SIGN(0.0) -> 0
SOURCELINE
Функция SOURCELINE в качестве результата возвращает порядковый номер последней строки исходного файла (если значение n не указано) или содержимое n-ной строки исходного файла (если значение n определено).
Если значение n указано, то оно должно быть целым положительным числом и не должно превышать номер последней строки исходного файла.
Ниже приведено несколько примеров: SOURCELINE() -> 10 SOURCELINE(1) -> '/* Это программа из 10 строк */'
SPACE
Функция SPACE разделяет отдельно стоящие слова в указанной строке с помощью n символов-заполнителей, вставляемых между словами. Значение n должно быть неотрицательным. Если оно равно нулю, то все пробелы удаляются. Обрамляющие пробелы также удаляются. По умолчанию значение n равно 1, и символом-заполнителем, принимаемым по умолчанию, является пробел.
Ниже приведено несколько примеров: SPACE('abc def ') -> 'abc def' SPACE(' abc def',3) -> 'abc def' SPACE('abc def ',1) -> 'abc def' SPACE('abc def ',0) -> 'abcdef' SPACE('abc def ',2,'+') -> 'abc++def'
STREAM
Функция STREAM в качестве результата возвращает описание потока символов с указанным именем, либо результат выполнения над потоком некоторой операции. Эта функция используется для получения информации о состоянии вводного или выводного потока, либо для выполнения некоторых специфических операций над потоком.
Первый аргумент имя определяет поток, к которому нужно получить доступ. В качестве второго аргумента может быть указана одна из следующих строк (при этом значащей будет только первая заглавная буква), описывающая действие, которое нужно выполнить:
Command | операция (указываемая в качестве третьего аргумента команда-потока), которая должна быть применена к выбранному вводному или выводному потоку. Возвращенная результирующая строка зависит от выполненной команды и может быть пустой строкой. |
Description | Возвращает текущее состояние указанного потока. Функция STREAM с данным режимом идентична операции State, за исключением того, что после возвращенной строки следует двоеточие и дополнительная информация о состояниях ERROR или NOTREADY, если она доступна. |
State | Возвращает строку, которая описывает текущее состояние указанного потока. Этот режим принимается по умолчанию. |
Функция STREAM, используемая с режимом State, возвращает одну из следующих строк:
'ERROR' | Над потоком была произведена операция, которая привела к возникновению ошибки (возможно, в процессе ввода, вывода или выполнения самой функции STREAM). Дополнительную информацию об ошибке можно получить с помощью функции STREAM с запросом на описание, зависящее от среды применения. |
'NOTREADY' | Поток находится в состоянии, при котором любая попытка выполнить стандартную операцию ввода-вывода приводит к формированию условия NOTREADY. Например, простой вводной поток может иметь определенную длину; попытка чтения из этого потока (с помощью встроенных функций CHARIN или LINEIN) сверх указанной длины может сделать поток недоступным до тех пор, пока он не будет закрыт (с помощью функции LINEIN(имя), например), а затем открыт повторно. |
'READY' | Поток находится в состоянии, при котором допустима любая стандартная операция ввода-вывода. Это обычное состояние для потока, хотя при этом не гарантируется, что любая конкретная операция будет выполнена успешно. |
'UNKNOWN' | Состояние потока неизвестно. В среде OS/2 и ее прикладных программах это обычно означает, что поток закрыт (или еще не открывался). Однако данный ответ может означать в других средах, что состояние потока невозможно определить. |
Прим. | Состояние ( и выбранный режим) вводного или выводного потока является глoбальным для программы REXX, в которой оно не сохраняется и не восстанавливается при обращении к функциям и подпрограммам (включая и те, которые вызваны для отслеживания событий по CALL ON). |
Обычно используются следующие команды потока: Открыть поток для чтения или записи Закрыть поток после выполнения операции Установить позицию чтения или записи внутри устойчивого потока (например, файла) Получить информацию о потоке (его существовании, размере и дате последнего изменения).
Если Вы указали режим С (команда), то должен использоваться и аргумент команда-потока. Синтаксис при этом будет следующим:
Функция STREAM, используемая в такой форме, сама возвращает строку, соответствующую указанной команде-потока, если эта команда завершилась успешно. Если же команда завершилась неуспешно, то функция STREAM возвращает строку с сообщением об ошибке в такой же форме, как и при выборе режима D (Описание).
Командные строки - Аргумент команда-потока может быть любым выражением, которое в процессе вычислений приводится языком REXX к одной из следующих командных строк:
'OPEN' | Открывает поименованный поток. По умолчанию команда OPEN открывает поток как для чтения, так и для записи данных. Для того, чтобы указать конкретную операцию, которую нужно выполнить над потоком с указанным именем, добавьте в командную строку слово READ (если требуется только чтение из потока) или WRITE (если требуется только запись в поток). Функция STREAM сама возвращает строку 'READY', если указанный поименованный поток успешно открыт, или соответствующее сообщение об ошибке в случае неуспешного открытия. Примеры: stream(strout,'c','open') stream(strout,'c','open write') stream(strinp,'c','open read') | ||||||||||
'CLOSE' | Закрывает поименованный поток. Функция STREAM сама возвращает строку 'READY', если указанный поименованный поток успешно закрыт, или соответствующее сообщение об ошибке в противном случае.
Если была сделана попытка закрыть неоткрытый файл, то функция STREAM() возвратит пустую строку (""). Пример: stream('STRM.TXT','c','close') | ||||||||||
'SEEK' смещение | Устанавливает внутри устойчивого потока позицию чтения или записи в соответствии с указанным числом (смещение).
Примеры: stream(name,'c','seek =2') stream(name,'c','seek +15') stream(name,'c','seek -7') fromend = 125 stream(name,'c','seek <'fromend) |
'QUERY EXISTS' | Возвращает полную спецификацию пути поименованного потока, если он существует, и пустую строку в противном случае. stream('..\file.txt','c','query exists') |
'QUERY SIZE' | Возвращает размер устойчивого потока в байтах. stream('..\file.txt','c','query size') |
'QUERY DATETIME' | Возвращает отметку даты и времени указанного потока. |
STRIP
Функция STRIP удаляет начальные и конечные символы из указанной строки в зависимости от режима, который Вы определили. Действительными режимами (при указании которых значащей будет только заглавная буква, остальные игнорируются) являются следующие:
Both | Удаляет как начальные, так и конечные символы из указанной строки. Этот режим принимается по умолчанию. |
Leading | Удаляет начальные символы из указанной строки. |
Trailing | Удаляет конечные символы из указанной строки. |
Третий аргумент символ определяет конкретный символ, который должен быть удален. Значением по умолчанию является пробел. В качестве значения аргумента символ может выступать любой одиночный символ.
Ниже приведено несколько примеров: STRIP(' ab c ') -> 'ab c' STRIP(' ab c ','L') -> 'ab c ' STRIP(' ab c ','t') -> ' ab c' STRIP('12.7000',,0) -> '12.7' STRIP('0012.700',,0) -> '12.7'
SUBSTR
Функция SUBSTR в качестве результата возвращает подстроку указанной строки, которая начинается с n-ного символа, имеет требуемую длину и дополнена при необходимости символами-заполнителями. Значение n должно быть целым положительным числом.
Если значение длины опущено, то в качестве результата возвращается остаток указанной строки. По умолчанию символом-заполнителем является пробел.
Ниже приведено несколько примеров: SUBSTR('abc',2) -> 'bc' SUBSTR('abc',2,4) -> 'bc ' SUBSTR('abc',2,6,'.') -> 'bc....'
Прим. | В некоторых ситуациях для выбора подстрок более удобны позиционные(числовые) схемы разбора шаблонов, особенно в случаях, когда из одной строки требуется извлечь несколько подстрок. |
SUBWORD
Функция SUBWORD в качестве результата возвращает подстроку указанной строки, которая начинается с n-ного слова и состоит из отдельно стоящих слов в количестве, определяемом значением длины. Значение n должно быть целым положительным числом. Если значение длины опущено, то по умолчанию оно принимается равным количеству оставшихся слов в строке. Возвращенная строка никогда не содержит начальных или конечных пробелов, но включает все пробелы, расположенные между выбранными словами.
Ниже приведено несколько примеров: SUBWORD('Now is the time',2,2) -> 'is the' SUBWORD('Now is the time',3) -> 'the time' SUBWORD('Now is the time',5) -> ''
SYMBOL
Функция SYMBOL в качестве результата возвращает состояние символа с указанным именем. Если имя не является действительным символом языка REXX, то в качестве результата возвращается значение BAD. Функция SYMBOL возвращает значение VAR, если указанное имя является именем переменной (т.е. символом, которому присвоено некоторое значение). В противном случае функция SYMBOL возвращает значение LIT, свидетельствующее о том, что указанный символ либо является константой, либо символом, которому еще не присвоено никакое значение (т.е. литералом).
Что касается символов, используемых в выражениях REXX, то строчные буквы указанного имени переводятся в прописные и по возможности выполняются подстановки для составных имен.
Прим. | Чтобы предотвратить подстановку значений перед передачей символа в функцию, в качестве имени нужно указывать текстовую строку (или выведенную из выражения). |
Ниже приведено несколько примеров: /* предшествовало: Drop A.3; J=3 */ SYMBOL('J') -> 'VAR' SYMBOL(J) -> 'LIT' /* проверяет "3" */ SYMBOL('a.j') -> 'LIT' /* проверяет "A.3" */ SYMBOL(2) -> 'LIT' /* константа */ SYMBOL('*') -> 'BAD' /* недействительный символ */
TIME
Функция TIME по умолчанию в качестве результата возвращает текущее время в 24-часовом формате "чч:мм:сс" (часы, минуты, секунды); например: 04:41:37
Для получения других форматов вывода времени или для получения доступа к счетчику прошедшего времени Вы можете использовать следующие режимы (при указании которых значащими являются только заглавные буквы):
Civil | Возвращает чч:ммxx, время в общепринятом формате, где чч может принимать значения от 1 до 12, а мм - от 00 до 59. Непосредственно за минутами следуют буквы "am" или "pm", чтобы отличить утреннее время (с полуночи 12:00am до 11:59am) от полуденного и послеполуденного времени (с полудня 12:00pm до 11:59pm). При отображении часа начальный ноль не добавляется. Для согласованности с прочими результатами функции TIME поле, отведенное для минут, содержит текущую минуту (а не ближайшую). |
Elapsed | Возвращает ссссссссс.тт0000, количество секунд с сотыми долями секунды, прошедших с момента, когда счетчик прошедшего времени был запущен или сброшен (см. ниже). Возвращенное число не содержит начальных нулей, но всегда имеет четыре конечных нуля в десятичной части. Назначение NUMERIC DIGITS не влияет на формат выводимого по данному режиму результата. |
Hours | Возвращает количество часов, прошедших с полуночи, в формате: чч (без начальных нулей). |
Long | Возвращает время в формате чч:мм:сс.тт0000 (где тт представляет собой дробную часть секунд, определяемую в сотых долях секунды). |
Minutes | Возвращает количество минут, прошедших с полуночи, в формате: мммм (без начальных нулей). |
Normal | Возвращает время в формате, принятом по умолчанию - чч:мм:сс, как описано выше. |
Reset | Возвращает ссссссссс.тт0000, число секунд с сотыми долями секунды, прошедших с момента, когда счетчик прошедшего времени был запущен или сброшен (см. ниже)? а также сбрасывает этот счетчик в ноль. Возвращенное число не содержит начальных нулей, но всегда имеет четыре конечных нуля в десятичной части. |
Seconds | Возвращает количество секунд, прошедших с полуночи, в формате: ссссс (без начальных нулей). |
Ниже приведено несколько примеров: TIME('L') -> '16:54:22.120000' /* Возможно */ TIME() -> '16:54:22' TIME('H') -> '16' TIME('M') -> '1014' /* 54 + 60*16 */ TIME('S') -> '60862' /* 22 + 60*(54+60*16) */ TIME('N') -> '16:54:22' TIME('C') -> '4:54pm'
Счетчик прошедшего времени
Счетчик прошедшего времени можно использовать для измерения интервалов реального времени. Часы запускаются при первом обращении к счетчику прошедшего времени. В качестве результата выполнения функций TIME('E') и TIME('R') возвращается значение 0.
Показания часов сохраняются в процессе обращения к внутренним программам, т.е. внутренняя программа наследует показания часов, запущенных вызывающей программой. Любой отсчет времени, выполняемый в вызывающей программе, не подвержен влиянию со стороны вызываемых программ или функций, даже если внутренняя программа произведет сброс часов.
Ниже приведен пример использования счетчика прошедшего времени: time('E') -> 0 /* При первом обращении */ /* здесь пауза в одну секунду */ time('E') -> 1.020000 /* или около того */ /* здесь пауза в одну секунду */ time('R') -> 2.030000 /* или около того */ /* здесь пауза в одну секунду */ time('R') -> 1.050000 /* или около того */
Прим. | По вопросу соответствия времен внутри одного выражения обращайтесь к описанию функции DATE. Счетчик прошедшего времени синхронизирован для других обращений к функциям TIME и DATE, поэтому при неоднократных обращениях к данному счетчику всегда возвращается один и тот же результат. По той же причине интервал между обычными результатами выполнения функций TIME и DATE может быть точно вычислен с помощью счетчика прошедшего времени. |
TRANSLATE
Функция TRANSLATE переводит символы указанной строки в другие символы, либо переупорядочивает символы в строке. При отсутствии таблицы перекодировки буквенные символы указанной строки просто переводятся из строчных в прописные (например, строчные a-z переводятся в прописные A-Z). Выводной таблицей является таблица1, а вводной таблицей перекодировки является таблица2 (по умолчанию принимается XRANGE('00'x,'FF'x)). По умолчанию в качестве выводной таблицы принимается пустая строка; выводная таблица при необходимости дополняется символами-заполнителями или усекается. По умолчанию символом-заполнителем является пробел. Таблицы могут быть любой длины; в случае дублирования символов во вводной таблице значащим будет первое появление символа.
Ниже приведено несколько примеров: TRANSLATE('abcdef') -> 'ABCDEF' TRANSLATE('abbc','&','b') -> 'a&&c' TRANSLATE('abcdef','12','ec') -> 'ab2d1f' TRANSLATE('abcdef','12','abcd','.') -> '12..ef' TRANSLATE('4123','abcd','1234') -> 'dabc'
Прим. | В последнем примере показано, как использовать функцию TRANSLATE для переупорядочения символов в строке. В примере последний символ любой четырехсимвольной строки, определенной в качестве второго аргумента, перемещается в начало строки. |
TRUNC
Функция TRUNC в качестве результата возвращает целую часть указанного числа и n десятичных цифр. По умолчанию значение n равно нулю, и функция TRUNC в этом случае возвращает только целую часть указанного числа. Если же значение n указано, то оно должно быть целым неотрицательным числом. Указанное число сначала округляется в соответствии со стандартными правилами языка REXX, т.е. как если бы была выполнена операция число+0. Затем число усекается до n десятичных цифр (или при необходимости добавляются конечные нули, чтобы довести результирующее число до требуемой длины). Результат никогда не представляется в экспоненциальной форме.
Ниже приведено несколько примеров: TRUNC(12.3) -> 12 TRUNC(127.09782,3) -> 127.097 TRUNC(127.1,3) -> 127.100 TRUNC(127,2) -> 127.00
Прим. | При необходимости число округляется в соответствии с текущим назначением NUMERIC DIGITS до того, как оно будет передано на обработку функции TRUNC. |
VALUE
Функция VALUE в качестве результата возвращает значение символа с указанным именем и, по требованию, присваивает ему новое значение. По умолчанию функция VALUE обращается к текущей среде переменных REXX, но могут быть выбраны и другие, внешние, коллекции переменных. Если Вы используете функцию VALUE для получения информации о переменных REXX, то значение имени должно быть действительным символом языка REXX. (Вы можете убедиться в этом, используя функцию SYMBOL). Строчные буквы указанного имени переводятся в прописные. Если имя является составным, то REXX подставляет значения символов для получения производного имени символа.
Если Вы указали аргумент новое-значение, то указанной поименованной переменной присваивается это новое значение. Данное действие не влияет на возвращенный результат; т.е. функция возвращает значение указанного имени таким, каким оно было до выполнения новой операции присваивания.
Ниже приведено несколько примеров: /* После: Drop A3; A33=7; K=3; fred='K'; list.5='Hi' */ VALUE('a'k) -> 'A3' VALUE('a'kk) -> '7' VALUE('fred') -> 'K' /* ищет FRED */ VALUE(fred) -> '3' /* ищет K */ VALUE(fred,5) -> '3' /* и устанавливает K=5 */ VALUE(fred) -> '5' VALUE('LIST.'k) -> 'Hi' /* ищет LIST.5 */
Чтобы использовать функцию VALUE для манипуляции переменными среды OS/2, в качестве значения переключателя должна быть указана строка 'OS2ENVIRONMENT' или выражение, результатом вычисления которого будет эта же строка. В этом случае переменная с указанным именем не должна быть действительным символом языка REXX. Когда функция VALUE используется для установки или изменения значения переменной среды, новое значение сохраняется после завершения выполнения процедуры REXX.
Ниже приведено несколько примеров: /* Дано: внешняя переменная FRED имеет значение 4 */ share = 'OS2ENVIRONMENT' say VALUE('fred',7,share) /* выводит '4' и присваивает */ /* переменной FRED значение 7 */
say VALUE('fred',,share) /* выводит '7' */
/* После выполнения процедуры FRED снова имеет значение 4 */ /* Получение доступа и изменение переменных среды OS/2 */ env = 'OS2ENVIRONMENT' new = 'C:\LIST\PROD;' say value('prompt',,env) /* выводит '$i[p]' (возможно) */ say value('path',new,env) /* выводит 'C:\EDIT\DOCS;' (возможно) */ /* и устанавливает PATH = 'C:LIST\PROD' */ say value('path',,env) /* выводит 'C:LIST\PROD' */ /* По завершении процедуры PATH = 'C:\LIST\PROD' */
Примечания:
Если функция VALUE обращается к непроинициализированной переменной REXX, то в качестве результата всегда возвращается значение переменной, принимаемое по умолчанию; условие NOVALUE не формируется. Условие NOVALUE никогда не формируется при ссылке на внешнюю коллекцию переменных.
Функция VALUE используется, когда переменная содержит имя другой переменной, или в случаях, когда имя переменной строится динамически. Если в качестве значения имени указана отдельная текстовая строка, то символ является константой и поэтому обращение к функции можно, как правило, заменить этой строкой (т.е. символами, расположенными в кавычках). (Например, fred=VALUE('k'); идентично присваиванию fred=k;, если только не было отслежено условие NOVALUE).
Для осуществления временных изменений переменных среды используйте функции SETLOCAL и ENDLOCAL.
VERIFY
Функция VERIFY в качестве результата возвращает некоторое число, указывающее, состоит ли заданная строка только лишь из символов справочника. VERIFY возвращает позицию первого символа в строке, который не был найден в справочнике. Если найдены все символы в справочнике, то в качестве результата возвращается значение 0.
Третий аргумент режим может быть любым выражением, результатом вычисления которого является строка, начинающаяся с букв n или M (что соответствует режимам nomatch (по умолчанию) или Match соответственно). Значащей является только первая буква режима, которая может быть как строчной, так и прописной. Если указан режим nomatch, то в качестве результата возвращается позиция первого символа в строке, который не найден в справочнике. Если же все символы строки найдены в справочнике, то в качестве результата возвращается значение 0. Если указан режим Match, то в качестве результата возвращается позиция первого символа в строке, который найден в справочнике, или 0, если не найден ни один из символов.
По умолчанию значением аргумента Содержание является 1, таким образом, просмотр начинается с первого символа строки. Вы можете отменить значение по умолчанию, указав конкретную точку начала просмотра; указываемое значение должно быть целым положительным числом.
Функция VERIFY в качестве результата всегда возвращает 0, если указанная строка пуста или если значение начала больше, чем значение LENGTH(строка). Если справочник пустой, то функция VERIFY в качестве результата возвращает значение 0 (если указан режим Match) и 1 - в противном случае.
Ниже приведено несколько примеров: VERIFY('123','1234567890') -> 0 VERIFY('1Z3','1234567890') -> 2 VERIFY('AB4T','1234567890') -> 1 VERIFY('AB4T','1234567890','M') -> 3 VERIFY('AB4T','1234567890','N') -> 1 VERIFY('1P3Q4','1234567890',,3) -> 4 VERIFY('AB3CD5','1234567890','M',4) -> 6
WORD
Функция WORD в качестве результата возвращает n-ное отдельно стоящее слово в указанной строке. Значение n должно быть целым положительным числом. Если количество слов в строке меньше указанного значения n, то в качестве результата возвращается пустая строка. Данная функция эквивалентна следующей функции: SUBWORD(строка,n,1).
Ниже приведено несколько примеров: WORD('Now is the time',3) -> 'the' WORD('Now is the time',5) -> ''
WORDINDEX
Функция WORDINDEX в качестве результата возвращает позицию первого символа n-ного отдельно стоящего слова в указанной строке. Значение n должно быть целым положительным числом. Если количество слов в строке меньше указанного значения n, то в качестве результата возвращается число 0.
Ниже приведено несколько примеров: WORDINDEX('Now is the time',3) -> 8 WORDINDEX('Now is the time',6) -> 0
WORDLENGTH
Функция WORDLENGTH в качестве результата возвращает длину n-ного отдельно стоящего слова в указанной строке. Значение n должно быть целым положительным числом. Если количество слов в строке меньше указанного значения n, то в качестве результата возвращается число 0.
Ниже приведено несколько примеров: WORDLENGTH('Now is the time',2) -> 2 WORDLENGTH('Now comes the time',2) -> 5 WORDLENGTH('Now is the time',6) -> 0
WORDPOS
Функция WORDPOS просматривает указанную строку на предмет поиска первого появления последовательности отдельно стоящих слов, определяемых аргументом фраза, и в качестве результата возвращает порядковый номер первого слова фразы в просматриваемой строке. Несколько пробелов между словами как во фразе, так и в строке при сравнении обрабатываются как один пробел, но остальные слова должны в точности совпадать.
По умолчанию просмотр начинается с первого слова указанной строки. Вы можете отменить значение по умолчанию, указав значение аргумента Содержание (которое должно быть положительным); это значение будет определять порядковый номер слова, с которого следует начать просмотр строки.
Ниже приведено несколько примеров: WORDPOS('the','now is the time') -> 3 WORDPOS('The','now is the time') -> 0 WORDPOS('is the','now is the time') -> 2 WORDPOS('is the','now is the time') -> 2 WORDPOS('is time ','now is the time') -> 0 WORDPOS('be','To be or not to be') -> 2 WORDPOS('be','To be or not to be',3) -> 6
WORDS
Функция WORDS в качестве результата возвращает количество отдельно стоящих слов в указанной строке.
Ниже приведено несколько примеров: WORDS('Now is the time') -> 4 WORDS(' ') -> 0
X2B (Шестнадцатеричное в двоичное)
Функция X2B преобразует шестнадцатеричную-строку (т.е. строку, состоящую из шестнадцатеричных символов) в эквивалентную строку двоичных символов. Шестнадцатеричная-строка может иметь любую длину; каждый шестнадцатеричный символ преобразуется в строку из четырех двоичных цифр. Возвращенная результирующая строка не содержит ни одного пробела и имеет длину, в четыре раза превышающую длину исходной строки.
При желании для читабельности можно добавить пробелы (только на границе байта, а не начальные и конечные); в процессе преобразования они игнорируются.
Если в качестве шестнадцатеричной-строки указана пустая строка, то функция X2B возвращает значение 0.
Ниже приведено несколько примеров: X2B('C3') == '11000011' X2B('7') == '0111' X2B('1 C1') == '000111000001'
Вы можете использовать функцию X2B(..) в сочетании с функциями D2X(..) и C2X(..) для преобразования десятичных чисел или символьных строк в двоичную форму.
Ниже приведено несколько примеров: X2B(C2X('C3'x)) == '11000011' X2B(D2X('129')) == '10000001' X2B(D2X('12')) == '1100'
X2C (Шестнадцатеричное в символьное)
Функция X2C преобразует шестнадцатеричную-строку (т.е. строку, состоящую из шестнадцатеричных символов) в эквивалентную символьную строку.
Шестнадцатеричная-строка может иметь любую длину. При желании для читабельности в шестнадцатеричную-строку можно добавить пробелы (только на границе байта, а не начальные или конечные); в процессе преобразования они игнорируются.
При необходимости шестнадцатеричная-строка дополняется начальным нулем для получения четного числа шестнадцатеричных цифр.
Ниже приведено несколько примеров: X2C('4865 6c6c 6f') -> 'Hello' /* ASCII */ X2C('3732 73') -> '72s' /* ASCII */ X2C('F') -> '0F'x
X2D (Шестнадцатеричное в десятичное)
Функция X2D преобразует шестнадцатеричную-строку (т.е. строку, состоящую из шестнадцатеричных символов) в эквивалентную строку, содержащую десятичное число. Если результат не может быть представлен в виде целого числа, то происходит ошибка. Результат не может состоять из большего количества цифр, чем это установлено в текущем назначении NUMERIC DIGITS.
При желании для читабельности в шестнадцатеричную-строку можно добавить пробелы (только на границе байта, а не начальные или конечные); в процессе преобразования они игнорируются.
Если в качестве шестнадцатеричной-строки указана пустая строка, то функция X2D возвращает значение 0.
Если значение n не указано, то шестнадцатеричная-строка обрабатывается как двоичное число без знака.
Ниже приведено несколько примеров: X2D('0E') -> 14 X2D('81') -> 129 X2D('F81') -> 3969 X2D('FF81') -> 65409 X2D('c6 f0'X) -> 240
Если значение n указано, то данная последовательность шестнадцатеричных цифр слева дополняется нулями (отметим, что без знакового разряда) или усекается слева до n символов. Результирующая строка, состоящая из n шестнадцатеричных цифр, рассматривается как двоичное число со знаком - положительное, если старший левый бит сброшен, и отрицательное (в форме дополнения до двоичного числа два), если старший левый бит установлен. Если значение n равно нулю, то функция X2D в качестве результата возвращает 0.
Ниже приведено несколько примеров: X2D('81',2) -> -127 X2D('81',4) -> 129 X2D('F081',4) -> -3967 X2D('F081',3) -> 129 X2D('F081',2) -> -127 X2D('F081',1) -> 1 X2D('0031',0) -> 0
XRANGE
Функция XRANGE в качестве результата возвращает строку всех однобайтных кодов, расположенных между значениями аргументов Содержание и конец, включая начальное и конечное значения. Значением по умолчанию для аргумента Содержание является '00'x, а для аргумента конец- 'FF'x. Если значение аргумента Содержание больше, чем значение аргумента конец, то значения выводятся в направлении от 'FF'x к '00'x. Если значения аргументов Содержание и конец указаны, то они должны представлять собой одиночные символы.
Ниже приведено несколько примеров: XRANGE('a','f') -> 'abcdef' XRANGE('03'x,'07'x) -> '0304050607'x XRANGE(,'04'x) -> '0001020304'x XRANGE('i','j') -> '898A8B8C8D8E8F9091'x /* EBCDIC */ XRANGE('FE'x,'02'x) -> 'FEFF000102'x XRANGE('i','j') -> 'ij' /* ASCII */
Функция RXQUEUE
Функцию RxQueue используйте в процедуре REXX для создания и удаления очередей, а также для назначения и опроса имен этих очередей. Первый параметр определяет функцию, которая должна быть выполнена; имя функции указывайте полностью, строчными или прописными буквами.
Синтаксис:
Параметры:
Create | Создает очередь с именем, определяемым аргументом имя-очереди (если этот аргумент указан); если же имя не указано, то REXX сам определяет имя очереди. В любом случае в качестве результата возвращает имя созданной очереди. | ||||||||||||
Delete | Удаляет поименованную очередь; в случае успешного удаления возвращает значение 0, в случае ошибки возвращает ненулевой результат; возможные результирующие значения перечислены ниже:
| ||||||||||||
Get | Возвращает имя очереди, используемой в настоящий момент. | ||||||||||||
Set | Присваивает текущей очереди имя, указанное в аргументе новое-имя-очереди, и в качестве результата возвращает предыдущее имя данной очереди. |
Пример: Простая очередь в процедуре REXX
/* */ /* push/pull БЕЗ мультипрограммной поддержки */ /* */ push date() time() /* помещает в очередь дату и время */ do 1000 /* пропускается промежуток времени */ nop /* нет операции */ end /* конец цикла */ pull a b . /* получает информацию из очереди */ say 'Pushed at ' a b ', Pulled at ' date() time() /* выводит время от времени */
/* */ /* push/pull С мультипрограммной поддержкой */ /* (без восстановления при ошибках и без проверки */ /* неподдерживаемых сред) */ newq = RXQUEUE('Create') /* создает единственную очередь */ oq = RXQUEUE('Set',newq) /* устанавливает новую очередь */ push date() time() /* помещает в очередь дату и время */ do 1000 /* пропускается промежуток времени */ nop /* нет операции */ end /* конец цикла */ pull a b . /* получает информацию из очереди */ say 'Pushed at ' a b ', Pulled at ' date() time() /* сообщает пользователю */ call RXQUEUE 'Delete',newq /* удаляет созданную очередь */ call RXQUEUE 'Set',oq /* восстанавливает имя очереди (не требуется)*/
Специальные соображения
Внешние программы, которые должны взаимодействовать с процедурой REXX с помощью определенных очередей данных, могут использовать сеансовую очередь, очередь, принимаемую по умолчанию, либо получить имя очереди данных с помощью технологии межзадачного взаимодействия. Данная технология может включать передачу параметров, помещение в заранее подготовленную логическую очередь или использовать обычный механизм межзадачного взаимодействия OS/2 (например, каналы, разделенная память или очереди IPC).
Поименованные очереди доступны для всей операционной системы; поэтому и имена очередей должны быть уникальными. Если существует очередь с именем os2que и выдана следующая функция: newqueue = RXQUEUE('Create', 'os2que')
то будет создана новая очередь, и имя для нее выберет REXX. Это новое имя будет возвращено в качестве результата выполнения функции.
Любая запущенная внешняя программа наследует в качестве очереди, принимаемой по умолчанию, очередь, используемую в данный момент вызывающей программой.
Отсоединенные процессы
Отсоединенные процессы получают доступ к отсоединенной сеансовой очереди, которая уникальна для каждого отсоединенного процесса. Важно отметить, что эта отсоединенная сеансовая очередь отличается от сеансовой очереди запущенного процесса.
Процедуры REXX, которые должны выполняться как отсоединенные процессы, не могут использовать инструкции SAY, PULL и PARSE PULL, требующие ввода с клавиатуры или вывода на экран дисплея. Однако инструкции PULL и PARSE PULL, работающие только с очередью, допустимы для использования в отсоединенных процессах.
Примечания по мультипрограммированию
Механизм организации очередей данных в этом случае отличается от стандартного механизма организации очередей API операционной системы OS/2 следующим:
Очередь НЕ принадлежит какому-то конкретному процессу, т.е. любой процесс имеет право в любой момент изменить очередь. При выполнении операций, которые могут повлиять на состояние очереди, ресурс преобразуется из параллельного в последовательный так, что не нарушается сохранность данных.
Однако синхронизация запросов ( когда два процесса, имеющие доступ к одной и той же очереди, получают данные из этой очереди в порядке регистрации их запросов) является обязанностью пользователя и не обеспечивается подсистемой. Данный селектор принадлежит вызывающей прикладной программе и должен быть освобожден этой программой с помощью DosFreeSeg.
Стандартная очередь IPC операционной системы OS/2 принадлежит конкретному процессу (создается по его запросу). После завершения процесса очередь разрушается. В то же время очереди, созданные с помощью функции RxQueue('Create', имя-очереди) существуют до тех пор, пока не будут ЯВНО удалены. Завершение выполнения программы или процедуры, создавшей личную очередь, не влечет за собой принудительного удаления личной очереди. Любые данные в очереди после завершения процесса создания остаются в ней до тех пор, пока либо данная очередь не будет удалена (с помощью обращения к функции REXX RxQueue('Delete', имя-очереди), либо пока данные не будут прочитаны.
Очереди данных должны быть явно удалены некоторой процедурой или программой (не обязательно программой, создавшей очередь). Удаление очереди, в которой остались элементы, разрушает эти элементы. Если очередь не удалена, то она будет потеряна и ее невозможно будет восстановить, кроме как при случайной попытке получить доступ к каждой очереди в определенном порядке.
Интерфейс очередей
REXX обеспечивает организацию и ведение собственных очередей отдельно от очередей межзадачных взаимодействий OS/2. Очереди, о которых будет идти речь в этом разделе, используются только в процедурах REXX.
В процедурах работа с очередями REXX осуществляется с помощью следующих инструкций:
PUSH | Помещает строку в начало очереди (LIFO). |
QUEUE | Добавляет строку в конец очереди (FIFO). |
PULL | Считывает строку из начала очереди. Если очередь пуста, то строка считывается с консоли (STDIN:). |
Чтобы получить информацию о количестве элементов, оставшихся в очереди, используйте функцию QUEUED.
Доступ к очередям
REXX поддерживает два типа очередей. Доступ к этим очередям и их обработка осуществляется по именам.
Сеансовые очереди - Для каждого активного сеанса OS/2 автоматически обеспечивается одна сеансовая очередь. Сеансовая очередь всегда имеет имя SESSION, и REXX создает ее при первом запросе от программы или процедуры на помещение информации в очередь. Все процессы (программы и процедуры) в сеансе могут получить доступ к сеансовой очереди. Однако каждый конкретный процесс может получить доступ к сеансовой очереди, определенной только для того сеанса, в котором он выполняется, и эта сеансовая очередь не является уникальной для любого одиночного процесса, выполняющегося в сеансе.
Личные очереди - Личные очереди создаются (и удаляются) при выполнении Вашей конкретной программы. Вы можете сами дать имя очереди, либо оставить это на усмотрение языка REXX. Для того, чтобы Ваша программа могла использовать любую очередь, ей должно быть известно имя очереди.