воскресенье, 3 апреля 2016 г.

Пользовательские z-переменные и z-функции в Cache'

Cache' позволяет определить пользовательские z-функции и z-переменные таким образом, что они будут доступны из любой области. К переменным относятся объекты, синтаксически употребимые в контексте переменных, например:

s <varname>=<varvalue>
w <varname>

При этом в <varname> входят только символы латинских букв, цифры и специальные символы таким образом, что лексема <varname> может быть подставлена вместо локальной переменной. Для того, чтобы создать пользовательскую системную переменную, в Cache' зарезервированы рутины в области %SYS c %ZLANGV00.INT до %ZLANGV08.INT.


Для создания переменной следует выбрать для нее имя. Имя должно начинаться с буквы z. При вызове системной пользовательской переменной перед ее именем следует ставить символ доллара $. Например, $zvar. В одной из рутин %ZLANGV0*.INT создаем метку с именем, образованным из придуманного нами имени путем перевода его в верхний регистр. В нашем случае это будет ZVAR.

Далее следует определиться, будет ли эта переменная использоваться в левой части оператора приравнивания, например, s $zvar=123. Если да, то в тексте рутины следует добавить аргумент к метке ZVAR. В случае если переменную планируется использовать в контексте чтения, например, в правой части приравнивания, то в теле обработчика следует проверить контекст вызова, обратившись к системной переменной $Q. Если функция вызвана в контексте возврата, то следует вернуть значение, иначе - ничего не возвращать.

Заготовка кода, реализующего системную пользовательскую переменную, может иметь вид:

ZVAR(source)
        i $D(source) d
        . ; было присваивание переменной $ZVAR
        i $Q d
        . ; было чтение переменной $ZVAR
        q:$Q return  q

На этой заготовке можно отладить свою пользовательскую системную переменную. Вызывать созданную таким образом переменную можно нечувствительно к регистру, например

s $ZVar=123
s $ZVAR=123
s $zvar=123

Будут обращениями к одной и той же системной пользовательской z-переменной.
Для создания пользовательской z - функции следует добавить соответствующий ей обработчик в одну из рутин %ZLANGF00.INT - %ZLANGF08.INT. Имя пользовательской z-функции должно начинаться на z. Следует определиться с количеством аргументов этой функции и создать обработчик. Имя метки в коде обработчика должно быть в верхнем регистре.

Например

ZFUNCTION(arg)
        i $D(arg) d
        . ; были переданы аргументы
        i $Q d
        . ; ожидается возврат
        q:$Q 123  q

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

Определенные описанным выше способом пользовательские z-функции могут быть вызваны в любой области, поэтому в их обработчиках не следует полагать, что их работа будет происходить только в определенной области. Перечисленные выше возможности Cache по расширению системных переменных и функций, равно как и описанных ранее пользовательских команд, позволяют с некоторым комфортом обустроить рабочее место как администратора, так и сопровождающего прикладного программиста. Как это может помочь системному программисту (некий каламбур) - пока не вижу способа.

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

Но даже в такой форме предоставляемые Cache' возможности уже смотрятся практично. 

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

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