вторник, 19 марта 2019 г.

MiniM. Как сделать $Z переменную

В некоторых задачах переноса программ на MiniM может возникнуть необходимость эмулировать $Z переменную, которую не поддерживает MiniM. Эта статья описывает как ее можно создать, на примере переменной $ZPOS.

Чтобы создать $Z переменную в MiniM, нужно использовать три возможности MiniM Database Server:
  1. Возможность написать на MUMPS свою дополнительную $Z функцию
  2. Использовать факт что вызов подпрограммы без аргументов в MiniM эквивалентен вызову подпрограммы с нулевым числом аргументов.
  3. Использовать факт, что пользовательские $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 нельзя.

Комментариев нет:

Отправить комментарий