ADDRESS()res = ADDRESS(<имя>,<приоритет>[,<смещение>][,<версия>])
Функция возвращает имя текущего "хозяина" ARexx-программы (т.е. имя связного порта, куда отправляются все те утверждения программы, которые сам ARexx-интерпретатор понять не в состоянии). Пример:
say ADDRESS ==> TURBOCALC.1
ADDLIB()res = ADDLIB(<имя>,<приоритет>[,<смещение>][,<версия>])
Функция добавляет библиотеку ARexx-a к списку библиотек, имеющегося у системного ARexx-процесса.
Аргумент "имя" добавляемой библиотеки чувствителен к регистру букв, поэтому не стоит вводить, например, "REXXSUPPORT.LIBRARY" вместо "rexxsupport.library". В случае сомнения, загляните лишний раз в каталог LIBS: как там названа нужная библиотека. Не забывайте также заключать имя библиотеки в апострофы, иначе ARexx автоматически преобразует его в заглавный регистр! Если в "имени" явно не указан маршрут, то предполагается, что искомая библиотека находится в каталоге LIBS:.
Параметр <приоритет> - целое число в диапазоне от -100 до 100 определяет порядок поиска требуемой функции в серии подключенных библиотек. Библиотеки просматриваются в порядке убывания приоритета. Поскольку "перелистывание" библиотек при поиске нужной функции занимает некоторое время, есть смысл присваивать больший приоритет часто используемым библиотекам. Если библиотеки добавлялись в список с одним и тем же приоритетом, то порядок их просмотра будет соответствовать порядку включения в список.
Параметр "смещение" для некоторой библиотеки определяется тем, кто эту библиотеку создал. Почти во всех библиотеках значение "смещения" равно -30. Почему именно 30? Дело в том, что по отношению к базовому адресу библиотеки, который ОС возвращает ARexx-y при ее открытии, таблица векторов функций занимает меньшие адреса памяти. Каждый вектор занимает ровно 6 байт; первые 5 векторов обслуживают внутрисистемные нужды - такие как открытие и закрытие библиотеки и т.д. Поэтому функции ARexx-a начинаются с "общей" (public) части таблицы векторов, отстоящей на -(6x5) = -30 байт от базового адреса.
Параметр "версия" определяет минимальный номер версии (не модификации!) открываемой библиотеки. В случае равенства нулю, сгодится библиотека любой версии. При ненулевом значении ARexx откажется использовать библиотеку в том случае, если номер ее версии будет меньше значения параметра "версия" (принимается во внимание только ВЕРСИЯ, но не МОДИФИКАЦИЯ! Например, версия библиотеки reqtools.library 38.1266 равна 38, а модификация - 1266).
Пример:
call ADDLIB('rexxsupport.library', 0, -30, 0)
При исполнении ADDLIB() никакой реальной загрузки библиотеки не происходит - ее имя просто добавляется в список ARexx-библиотек и все. Загрузка произойдет позже, в том случае, если ARexx встретит неизвестную функцию в теле программы.
ARG()res = ARG([<номер>][,'E'|'O'])
Будучи использованной без аргументов, функция ARG() возвращает количество аргументов, переданных ARexx-программе при ее запуске. Если задан единственный параметр "номер", то возвращается сам аргумент с этим номером, либо пустая строка, если такой аргумент отсутствует. Если использован один из взаимоисключающих параметров 'E' (Exists - существует) или 'О' (Omitted - опущен), то функция возвращает булевское значение TRUE или FALSE, в зависимости от того, был ли передан программе заданный "номером" аргумент.
Если ARexx-программа была запущена из shell (как правило, с помощью команды RX), то все переданные аргументы рассматриваются как единая строка, даже невзирая на явные разделители типа запятой. Множественные аргументы передаются только подпрограммам, вызванным в качестве внутренних функций или программам, вызванным в качестве внешних функций. Пример:
Мы вызвали программу из shell следующим образом:
rx "program parl,par2,par3"
В программе исполняются следующие утверждения ARexx-a:
say ARG() ==> 1 say ARG(1) ==> parl,par2,par3 say ARG(2, E) ==> 0 say ARG(2, O) ==> 1
Если же мы вызвали эту же программу, как функцию, то результат будет иным:
say ARG() ==> 3 say ARG(1) ==> par1 say ARG(2) ==> par2 say ARG(2, E) ==> 1 say ARG(2, O) ==> 0
DATATYPE()res = DATATYPE(<строка>)[,<тип>])
Если параметр "тип" отсутствует, функция вернет строку "NUM" в случае, если "строка" может трактоваться, как число в любом из допустимых для ARexx-a форматов чисел; в противном случае будет возвращена строка "char".
Если присутствует параметр "тип", то функция возвращает булевское значение TRUE или FALSE в зависимости от того, принадлежит ли "строка" к заданному типу. "Тип" может иметь значения:
Numeric - число; Whole - целое (integer) число; X - шестнадцатеричное число; Binary - двоичное число; Alphanumeric - все русские и латинские буквы, либо цифры от 0 до 9; Upper - заглавные русские и латинские буквы; Lowercase - строчные русские и латинские буквы; Mixed - все русские и латинские буквы; Symbol - символ ARexx-a.
Функция правильно работает со всеми русскими буквами, если в вашей системе находится слегка скорректированная автором этой книги библиотека rexxsyslib.library, входящая в комплект русификатора, начиная с версии 6.03 (стандартные версии библиотеки отказываются считать "Ё" и "ё" за букву).
Пример:
say DATATYPE('Привет', 'm') ==> 1
DELAY()res = DELAY(<задержка>)
Функция вызывает задержку исполнения ARexx-программы на временной интервал, равный "задержке", деленной на 50 (в секундах). Возвращаемое функцией значение несущественно.
ARexx-программирование на Амиге подчиняется тем же общим правилам, что и программирование на Амиге вообще - зацикливание с целью получения требуемой временной задержки считается грубейшей ошибкой! Функция DELAY() просто кладет вашу программу "спать" на заданный промежуток времени, не расходуя процессорного времени на пустопорожние зацикливания.
DIGITS()res = DIGITS()
Функция возвращает результат текущей установки NUMERIC DIGITS, определяющей точность расчета арифметических выражений.
ERRORTEXT()res = ERRORTEXT(<номер>)
Возвращается текст, характеризующий ошибку с заданным "номером". Если для заданного "номера" текст отсутствует, то возвращается пустая строка.
FORM()res = FORM()
Функция возвращает результат текущей установки NUMERIC FORM, определяющей формат вывода экспоненциальной формы числа (научный - SCIENTIFIC или инженерный - ENGINEERING).
FUZZ()res = FUZZ()
Функция возвращает результат текущей установки NUMERIC FUZZ, определяющей точность сравнения чисел.
GETCLIP()res = GETCLIP(<имя>)
Возвращается содержимое клипа, определяемого "именем" (регистр букв "имени" учитывается). Если клип с заданным "именем" отсутствует, возвращается пустая строка.
PRAGMA()res = PRAGMA(<опция>[,<значение>])
Функция изменяет системное окружение ARexx-программы, либо возвращает информацию о нем. "Опция" определяет требуемый элемент окружения, которому ставится в соответствие некоторое "значение". Ниже дан список возможных "опций" (при вызове функции достаточно указать только первую букву имени "опции").
Опция | Значение | Пояснение |
Directory | [<маршрут>] | Если указан "маршрут", то по нему устанавливается текущий каталог ARexx-программы. Если "маршрут" не указан, возвращается маршрут текущего каталога. |
ID | Возвращает шестнадцатеричное значение - идентификатор процесса, ассоциированного с текущей ARexx-программой. Если одновременно работают несколько копий этой программы, то этот идентификатор позволяет различать их, что, например, часто требуется при создании внутри каждой из работающих копий связного порта с уникальным именем, используя функцию OPENPORT(). | |
Priority | [<число>] | По аналогии с ОС-командой SETPRI управляет приоритетом процесса, ассоциированного с текущей ARexx-программой. Если "число" отсутствует, то возвращается текущий приоритет этого процесса; в противном случае устанавливается новый приоритет в соответствии с "числом" и возвращается значение прежнего приоритета. "Число" может принимать значения в диапазоне от -127 до 127, однако в реальной жизни значение "числа", превышающее приоритет резидентного ARexx-процесса (как правило, 4), является недопустимым. |
Stack | [<число>] | Если "число" присутствует, то переопределяет размер стека текущего ARexx-процесса в соответствии с "числом" и возвращает прежний размер стека; в противном случае просто возвращается размер стека. |
[<имя>] | Ставит в соответствие новое логическое "имя" текущему хэндлеру консольного (shell) окна, идентификатором которого в ОС является символ "*". Таким образом становится возможным ассоциировать несколько потоков ввода (вывода) с одним и тем же окном. | |
Window | ['N' | 'W'] | Определяет поведение риквестеров системы, например, "Вставьте диск...". По умолчанию работает значение 'W' (сокращенно от Workbench), что заставляет риквестеры открываться на Workbench-экране; этот же режим будет включен при отсутствии "значения" во время вызова функции PRAGMA(). Значение 'N' (или 'NULL', отключает системные риквестеры, которые могли бы быть вызваны ОС Амиги в результате обращений к ней из текущей ARexx-программы. |
REMLIB()res = REMLIB(<имя>)
Функция удаляет указанную по "имени" библиотеку из списка библиотек резидентного ARexx-процесса. Как и любой другой ресурс системы (см. описание команды ОС AVAIL), отвергнутая библиотека не "отстреливается" из памяти немедленно - просто ее счетчик пользователей сбрасывается в ноль; изъятие же из памяти произойдет лишь тогда, когда памяти будет кому-то нехватать, либо подобная ситуация будет имитирована.
Функция полезна, например, если вы исполнили ADDLIB() для несуществующей библиотеки; наличие такой библиотеки в списке библиотек ARexx-a может в некоторых случаях помешать правильному поиску функций в действительно существующих библиотеках. Можно также использовать REMLIB(), если вы абсолютно уверены, что функции из добавленной по ADDLIB() библиотеки вам никогда больше не понадобятся и тратить время (и, возможно, память) на ненужную библиотеку незачем.
Функция возвращает TRUE, если требуемая библиотека была успешно удалена из списка.
SETCLIP()res = SETCLIP(<имя>[,<значение>])
Устанавливается содержимое клипа, определяемого "именем" (регистр букв "имени" учитывается) в соответствии с заданным "значением". Если "значение" отсутствует, то заданный "именем" клип удаляется.
SOURCELINE()res = SOURCELINE(<номер>)
Возвращается строка текста ARexx-программы в соответствии с ее "номером". Если "номер" отсутствует, возвращается общее число строк программы. Функцией удобно пользоваться для выдачи пользователю некоторой справочной информации прямо из текста программы.
SYMBOL()res = SYMBOL(<имя>)
Функция может возвращать одно из следующих значений:
- 'BAD' - возвращается в том случае, если "имя" не является символом ARexx-a;
- 'VAR' - указывает на то, что "имя" является переменной, которой было присвоено некоторое значение;
- 'LIT - получаем тогда, когда "имя" является константой либо переменной без присвоенного значения.
TRACE()res = TRACE(<опция>)
Функция возвращает строку, сообщающую о факте включения режима трассировки на момент исполнения TRACE(). Эту функцию можно также использовать для управления трассировкой подобно инструкции TRACE.
"Опция" может быть любым выражением, в результате вычисления которого получается литера, устанавливающая тот или иной режим трассировки (см. описание инструкции TRACE). Если "опция" определена, то функция возвратит идентификатор режима трассировки, который был установлен на момент исполнения TRACE(). В отличие от инструкции TRACE, функция TRACE() изменит режим трассировки "изнутри" программы даже если с помощью инструкции TS была начата интерактивная (диалоговая) трассировка. Идентификаторы '?' и '!' могут быть использованы в "опции" как поодиночке, так и в комбинации с буквенными опциями трассировки; '?' и '!' работают как переключатели, в первый раз включая заданную опцию, затем - выключая ее. '?' является переключателем интерактивной трассировки, а '!' - переключателем режима "отключенного хозяина".
VALUE()res = VALUE(<имя>)
Функция возвращает значение некоторого символа ARexx-a, идентифицируемого по его "имени". "Имя" может получаться в результате вычисления любого допустимого выражения. Таким образом, мы можем "вычислять" имя переменной, значение которой необходимо получить.