В некоторых задачах переноса программ на MiniM может возникнуть
необходимость
эмулировать $Z переменную, которую не поддерживает MiniM. Эта статья описывает
как ее можно создать, на примере переменной $ZPOS.
Чтобы создать $Z переменную в MiniM, нужно использовать три возможности MiniM Database Server:
Рассмотрим в качестве примера реализации пользовательской $Z переменной эмуляцию системной переменной $ZPOS. Эта переменная возвращает позицию в файле если текущее устройство ввода-вывода является файлом операционной системы. Для MiniM это соответствует устройству типа |FILE|.
Нужно создать рутину с именем начинающимся на символы %ZFUNC. В примере используем имя %ZFUNCFILE, поясняющее что в этой рутине будут подпрограммы для устройства |FILE|.
В этой рутине нужно создать подпрограмму с именем метки в верхнем регистре ZPOS. В подпрограмме необходимо вычислить текущую позицию в текущем устройстве если это устройство типа |FILE| и вернуть полученное значение. В MiniM Database Server это выполняется функцией $v("dev",8).
Пример рутины %ZFUNCFILE:
С использованием описанной техники MiniM Database Server позволяет создать произвольные $Z переменные, если программист знает способ как вычислить значение этой переменной на MUMPS либо используя встроенные функции $view, либо расширенные вызовы $zdll, либо иным способом.
Программист должен понимать, что переопределить встроенные $Z переменные и функции в MiniM Database Server нельзя.
Чтобы создать $Z переменную в MiniM, нужно использовать три возможности MiniM Database Server:
- Возможность написать на MUMPS свою дополнительную $Z функцию
- Использовать факт что вызов подпрограммы без аргументов в MiniM эквивалентен вызову подпрограммы с нулевым числом аргументов.
- Использовать факт, что пользовательские $Z функции в MiniM можно вызывать нечувствительно к регистру.
s retvalue=$$func^routineВызов подпрограммы с нулевым числом аргументов производится так:
s retvalue=$$func^routine()Поскольку в MiniM Database Server эти два вызова эквивалентны, можно создать пользовательскую $Z переменную, которая в действительности есть пользовательская $Z функция и создать пользовательскую $Z функцию с нулевым числом аргументов.
Рассмотрим в качестве примера реализации пользовательской $Z переменной эмуляцию системной переменной $ZPOS. Эта переменная возвращает позицию в файле если текущее устройство ввода-вывода является файлом операционной системы. Для MiniM это соответствует устройству типа |FILE|.
Нужно создать рутину с именем начинающимся на символы %ZFUNC. В примере используем имя %ZFUNCFILE, поясняющее что в этой рутине будут подпрограммы для устройства |FILE|.
В этой рутине нужно создать подпрограмму с именем метки в верхнем регистре ZPOS. В подпрограмме необходимо вычислить текущую позицию в текущем устройстве если это устройство типа |FILE| и вернуть полученное значение. В MiniM Database Server это выполняется функцией $v("dev",8).
Пример рутины %ZFUNCFILE:
%ZFUNCFILE ; emulate $ZPOS system variable q ZPOS ; return current offset of file device q $v("dev",8)После импорта рутины и её компиляции дополнительная переменная $ZPOS готова к использованию. Например:
s dev="|FILE|zscript.vbm" o dev:("rwt") u dev r line s pos=$zpos c devЗдесь открывается устройство типа |FILE| в тектовом режиме, читается одна строка, после чего вычисляется значение текущей позиции в файле вызовом новой $Z переменной $zpos, и файл закрывается.
С использованием описанной техники MiniM Database Server позволяет создать произвольные $Z переменные, если программист знает способ как вычислить значение этой переменной на MUMPS либо используя встроенные функции $view, либо расширенные вызовы $zdll, либо иным способом.
Программист должен понимать, что переопределить встроенные $Z переменные и функции в MiniM Database Server нельзя.
Комментариев нет:
Отправить комментарий