Загрузил julik1970

minimlang

реклама
MiniM Database Server
Описание языка
Версия 1.31
Евгений Каратаев
mailto:[email protected]
http://www.minimdb.com
19 мая 2021 г.
2
Оглавление
1
Синтаксис языка
1.1 Общий обзор . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6 Константы . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.7 Специальные переменные . . . . . . . . . . . . . . . . . . .
1.8 Структурные системные переменные . . . . . . . . . . . .
1.9 Локальные переменные . . . . . . . . . . . . . . . . . . . .
1.10 Глобальные переменные . . . . . . . . . . . . . . . . . . . .
1.11 Постусловные выражения . . . . . . . . . . . . . . . . . . .
1.12 Числа и строки . . . . . . . . . . . . . . . . . . . . . . . . .
1.13 Индексы . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.14 Голая ссылка . . . . . . . . . . . . . . . . . . . . . . . . . .
1.15 Косвенность . . . . . . . . . . . . . . . . . . . . . . . . . .
1.16 Программы . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.17 Метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.18 Передача параметров . . . . . . . . . . . . . . . . . . . . .
1.19 Комментарии . . . . . . . . . . . . . . . . . . . . . . . . . .
1.20 Блокировки . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.21 Устройства ввода-вывода . . . . . . . . . . . . . . . . . . .
1.22 Параметры устройств ввода-вывода . . . . . . . . . . . . .
1.23 Мнемоники устройств ввода-вывода . . . . . . . . . . . . .
11
11
12
12
13
14
15
16
16
17
18
20
21
22
23
25
27
30
31
34
34
36
38
39
2 Операторы
2.1 Унарный плюс (+) . . . . . . . . . . . . . . . . . . . . . . .
2.2 Сложение (+) . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Унарный минус (-) . . . . . . . . . . . . . . . . . . . . . . .
2.4 Вычитание (-) . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Умножение (*) . . . . . . . . . . . . . . . . . . . . . . . . .
41
41
42
42
43
44
3
4
ОГЛАВЛЕНИЕ
2.6 Деление (/) . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7 Целочисленное деление (backslash) . . . . . . . . . . . . .
2.8 Возведение в степень (**) . . . . . . . . . . . . . . . . . . .
2.9 Деление по модулю (#) . . . . . . . . . . . . . . . . . . . .
2.10 Конкатенация (_) . . . . . . . . . . . . . . . . . . . . . . . .
2.11 Нет (’) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.12 Равно (=) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.13 Больше (>) . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.14 Больше или равно (>=) . . . . . . . . . . . . . . . . . . . .
2.15 Меньше (<) . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.16 Меньше или равно (<=) . . . . . . . . . . . . . . . . . . . .
2.17 Проверка на вхождение ([) . . . . . . . . . . . . . . . . . .
2.18 Следует (]) . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.19 Следует или равно (]=) . . . . . . . . . . . . . . . . . . . .
2.20 Сортируется после (]]) . . . . . . . . . . . . . . . . . . . .
2.21 Сортируется после или равно (]]=) . . . . . . . . . . . . .
2.22 И (&) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.23 Короткий И (&&) . . . . . . . . . . . . . . . . . . . . . . .
2.24 ИЛИ (!) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.25 Короткий ИЛИ (||) . . . . . . . . . . . . . . . . . . . . . . .
2.26 XOR (!!) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.27 Проверка по шаблону (?) . . . . . . . . . . . . . . . . . . .
2.28 16-ое число (#) . . . . . . . . . . . . . . . . . . . . . . . .
44
45
46
47
47
48
50
51
51
52
52
53
54
55
55
56
56
57
58
58
59
60
63
3 Команды
3.1 CLOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 ELSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4 FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 GOTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.6 HALT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.7 HANG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8 IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9 JOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 KILL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.11 KSUBSCRIPTS . . . . . . . . . . . . . . . . . . . . . . . . .
3.12 KVALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.13 LOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.14 MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.15 NEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.16 OPEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
65
67
69
70
74
75
76
77
79
81
84
85
87
91
93
97
ОГЛАВЛЕНИЕ
5
3.17 QUIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
3.18 READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.19 SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.20 TCOMMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
3.21 TROLLBACK . . . . . . . . . . . . . . . . . . . . . . . . . . 117
3.22 TSTART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.23 USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.24 WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
3.25 XECUTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
4 Z - Команды
4.1 ZNEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 ZNSPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 ZPRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4 ZSYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5 ZTRAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.6 ZWRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7 ZZDUMP . . . . . . . . . . . . . . . . . . . . . . . . . . . .
129
129
131
133
136
136
138
140
5 Стандартные функции
5.1 $ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 $BIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 $BITCOUNT . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4 $BITFIND . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5 $BITLOGIC . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6 $CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.7 $DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.8 $EXTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.9 $FIND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.10 $FNUMBER . . . . . . . . . . . . . . . . . . . . . . . . . .
5.11 $GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.12 $JUSTIFY . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.13 $INCREMENT . . . . . . . . . . . . . . . . . . . . . . . . .
5.14 $LENGTH . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.15 $LIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.16 $LISTBUILD . . . . . . . . . . . . . . . . . . . . . . . . . .
5.17 $LISTDATA . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.18 $LISTFIND . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.19 $LISTFROMSTRING . . . . . . . . . . . . . . . . . . . . .
5.20 $LISTGET . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.21 $LISTLENGTH . . . . . . . . . . . . . . . . . . . . . . . . .
143
143
144
145
146
147
149
149
152
152
154
156
157
158
159
160
162
164
166
167
169
170
6
ОГЛАВЛЕНИЕ
5.22 $LISTSAME . . . . . . . . . . . . . . . . . . . . . . . . . .
5.23 $LISTTOSTRING . . . . . . . . . . . . . . . . . . . . . . .
5.24 $LISTVALID . . . . . . . . . . . . . . . . . . . . . . . . . .
5.25 $NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.26 $ORDER . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.27 $PIECE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.28 $QLENGTH . . . . . . . . . . . . . . . . . . . . . . . . . .
5.29 $QSUBSCRIPT . . . . . . . . . . . . . . . . . . . . . . . . .
5.30 $QUERY . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.31 $RANDOM . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.32 $REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.33 $REVERSE . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.34 $SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.35 $STACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.36 $TEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.37 $TRANSLATE . . . . . . . . . . . . . . . . . . . . . . . . .
5.38 $VIEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.38.1 $VIEW("db") . . . . . . . . . . . . . . . . . . . . . .
5.38.2 $VIEW("dev") . . . . . . . . . . . . . . . . . . . . .
5.38.3 $VIEW("err") . . . . . . . . . . . . . . . . . . . . . .
5.38.4 $VIEW("file") . . . . . . . . . . . . . . . . . . . . . .
5.38.5 $VIEW("jrnl") . . . . . . . . . . . . . . . . . . . . .
5.38.6 $VIEW("lock") . . . . . . . . . . . . . . . . . . . . .
5.38.7 $VIEW("log") . . . . . . . . . . . . . . . . . . . . . .
5.38.8 $VIEW("perf") . . . . . . . . . . . . . . . . . . . . .
5.38.9 $VIEW("proc") . . . . . . . . . . . . . . . . . . . . .
5.38.10$VIEW("rou") . . . . . . . . . . . . . . . . . . . . .
171
172
174
175
176
179
180
182
183
186
186
188
188
189
191
193
194
194
201
204
205
209
211
211
212
212
216
6 Z - Функции
6.1 $ZABS . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2 $ZARCCOS . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3 $ZARCSIN . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.4 $ZARCTAN . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.5 $ZBITAND . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.6 $ZBITCAT . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.7 $ZBITCOUNT . . . . . . . . . . . . . . . . . . . . . . . . .
6.8 $ZBITEXTRACT . . . . . . . . . . . . . . . . . . . . . . . .
6.9 $ZBITFIND . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.10 $ZBITGET . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.11 $ZBITLEN . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.12 $ZBITNOT . . . . . . . . . . . . . . . . . . . . . . . . . . .
217
217
218
218
219
220
220
221
221
222
223
224
224
ОГЛАВЛЕНИЕ
6.13 $ZBITOR . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.14 $ZBITROT . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.15 $ZBITSET . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.16 $ZBITSTR . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.17 $ZBITXOR . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.18 $ZBOOLEAN . . . . . . . . . . . . . . . . . . . . . . . . . .
6.19 $ZCOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.20 $ZCOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.21 $ZCRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.22 $ZCSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.23 $ZCONVERT . . . . . . . . . . . . . . . . . . . . . . . . . .
6.24 $ZDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.25 $ZDATEH . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.26 $ZDLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.27 $ZEXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.28 $ZLASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.29 $ZLCHAR . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.30 $ZLCASE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.31 $ZLN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.32 $ZLOG . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.33 $ZLOWER . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.34 $ZPCREMATCH . . . . . . . . . . . . . . . . . . . . . . . .
6.35 $ZPCREREPLACE . . . . . . . . . . . . . . . . . . . . . . .
6.36 $ZPCRESEARCH . . . . . . . . . . . . . . . . . . . . . . .
6.37 $ZPOWER . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.38 $ZPREVIOUS . . . . . . . . . . . . . . . . . . . . . . . . .
6.39 $ZQASCII . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.40 $ZQCHAR . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.41 $ZQUOTE . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.42 $ZSEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.43 $ZSIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.44 $ZSQR . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.45 $ZTAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.46 $ZTIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.47 $ZTIMEH . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.48 $ZUCASE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.49 $ZUPPER . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.50 $ZVERSION . . . . . . . . . . . . . . . . . . . . . . . . . .
6.51 $ZWASCII . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.52 $ZWCHAR . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
225
226
227
228
228
229
231
232
233
234
235
237
239
241
243
243
244
245
245
246
247
248
249
251
252
252
254
255
256
257
258
258
259
260
261
262
262
263
264
265
8
ОГЛАВЛЕНИЕ
7 Системные переменные
7.1 $DEVICE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 $HOROLOG . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 $ECODE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4 $ESTACK . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.5 $ETRAP . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.6 $IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.7 $JOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.8 $KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.9 $PRINCIPAL . . . . . . . . . . . . . . . . . . . . . . . . . .
7.10 $QUIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.11 $REFERENCE . . . . . . . . . . . . . . . . . . . . . . . . .
7.12 $STACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.13 $STORAGE . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.14 $SYSTEM . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.15 $TEST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.16 $TLEVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.17 $X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.18 $Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
267
267
268
269
271
271
272
273
274
274
275
276
277
278
279
279
281
282
283
8 Системные Z - переменные
285
8.1 $ZCHILD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
8.2 $ZEOF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
8.3 $ZERROR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
8.4 $ZGUID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
8.5 $ZHOROLOG . . . . . . . . . . . . . . . . . . . . . . . . . 288
8.6 $ZNAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
8.7 $ZNSPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
8.8 $ZPARENT . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
8.9 $ZPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
8.10 $ZREFERENCE . . . . . . . . . . . . . . . . . . . . . . . . 290
8.11 $ZTIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . 291
8.12 $ZTIMEZONE . . . . . . . . . . . . . . . . . . . . . . . . . 292
8.13 $ZTRAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
8.14 $ZVERSION . . . . . . . . . . . . . . . . . . . . . . . . . . 294
9 Структурные системные переменные
9.1 $DEVICE . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2 $GLOBAL . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3 $JOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.4 $LOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
297
297
298
301
303
ОГЛАВЛЕНИЕ
9
9.5 $ROUTINE . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
10 Параметры устройств
309
10.1 COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
10.2 CON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
10.3 DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
10.4 FILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
10.5 MEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
10.6 NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
10.7 PIPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
10.8 PRN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
10.9 STD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
10.10STORE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
10.11 TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
10.12TNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
11 Обработка ошибок
11.1 Средства обработки ошибок . . . . . . . . . . . . . . . . .
11.2 Схема обработки ошибок . . . . . . . . . . . . . . . . . . .
11.3 Генерация ошибки . . . . . . . . . . . . . . . . . . . . . . .
351
351
352
353
12 Регулярные выражения
355
12.1 Опции регулярных выражений . . . . . . . . . . . . . . . . 355
12.2 Синтаксис регулярных выражений . . . . . . . . . . . . . . 359
13 Перечень ошибок
385
13.1 Список ошибок комитета MDC . . . . . . . . . . . . . . . . 385
13.2 Список ошибок MiniM . . . . . . . . . . . . . . . . . . . . 387
13.3 Список системных ошибок MiniM . . . . . . . . . . . . . . 394
10
ОГЛАВЛЕНИЕ
Глава 1
Синтаксис языка
1.1
Общий обзор
Система MiniM соответствует текущему стандарту языка M[UMPS] и
придерживается рекомендаций комитета MDC.
Система является многопроцессным сервером, кэширующим блоки
глобалов и байт-коды рутин.
Исполняющая часть MiniM является интерпретатором компилирующего типа. Интерпретатор исполняет байт-код, полученный трансляцией
строки команд либо текста программ. Компиляция выполняется полностью, включая сложные случаи применения косвенности.
Система MiniM придерживается синтаксических конструкций "в духе и стиле" стандарта в случае реализации расширений, отведённых
стандартом на усмотрение производителя.
Система MiniM поддерживает транзакции и защиту базы данных от
сбоев путём комбинированного применения журнала и предзаписи блоков. Защищёнными являются не файлы данных, а совокупность файлов
данных, предзаписи и файлов журнала.
Кроме реализации стандартных языковых конструкций система MiniM
поддерживает ряд расширенных синтаксических конструкций, таких как
* инициализирующая форма команды new;
* присваивание функции $qsubscript;
* шестнадцатеричные числа;
* чтение и удаление из некоторых структурных системных переменных (ssvn);
* короткие логические операторы
и другие.
Также система MiniM поддерживает совместимость в отдельных син11
12
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
таксических конструкциях с другими реализациями M[UMPS] для достижения расширенной переносимости программ.
1.2
Команды
Все действия, выполняемые процессами MiniM, задаются командами.
Общая структура команды - ключевое слово команды, указывающее действие. За ним следует необязательное постусловие команды и за ключевым словом - аргументы команды. Команда применяется последовательно
слева направо к каждому аргументу.
Ключевые слова команд нечувствительны к регистру и могут быть
сокращены до одной буквы.
Команда может иметь или не иметь аргументов, во втором случае
такую форму называют безаргументной формой, и команда применяется
не к конкретному аргументу, а к общему контексту процесса. Например,
команда kill с аргументом удаляет одну указанную в аргументе переменную, а без аргументов удаляет все локальные переменные процесса.
Или команда lock с аргументом устанавливает блокировку на указанное
в аргументе имя, а без аргументов удаляет все блокировки процесса.
В отличие от других языков в языке M[UMPS] команда - минимально
необходимая единица выполнения.
Перечень поддерживаемых команд и спецификация аргументов каждой из них приведены в настоящем руководстве.
На одной строке может находиться не одна команда, а несколько подряд. В этом случае после выполнения команды управление передаётся
на следующую за ней команду слева направо.
Синтаксически недопустимо писать только один аргумент, не указывая, какую команду к нему следует применять.
1.3 Функции
Функциями называются встроенные элементы языка, выполняющие над
аргументами определённые действия и возвращающие значение.
Встроенные (или системные) функции начинаются на один символ
доллара $, за которым следует имя функции. Имя встроенных функций
может быть сокращено до одного или двух символов. Имя встроенной
функции нечувствительно к регистру.
Пользовательские функции создаются программистом как часть программы. Для пользовательской функции указываются её формальные ар-
1.4. ОПЕРАТОРЫ
13
гументы, если они есть. При вызове пользовательской функции пишутся
два символа доллара $$, за которыми следует имя метки в программе,
где описана эта функция. За именем следует символ рутины (ˆ), круглые скобки и перечисление фактических параметров. Имя рутины может
быть опущено, если вызываемая метка находится в текущей программе
(рутине).
Если вызываемая метка не имеет параметров и описана без круглых скобок, то и вызывать её следует, не указывая круглые скобки. В
этом случае такой частный вид пользовательской функции называется
пользовательской переменной. Такая переменная синтаксически доступна только на чтение, поскольку только возвращает значение.
Имена пользовательских функций чувствительны к регистру.
Для каждой встроенной функции компилятор MiniM генерирует соответствующий ей байт-код, а для пользовательской функции генерирует
байт-код вызова метки с передачей параметров.
Если поведение пользовательских функций может быть переопределено, то поведение встроенных функций определяется стандартом и версией MiniM.
Кроме перечня стандартных встроенных функций система MiniM
поддерживает набор расширенных функций, имена которых начинаются
на символ $, за которым следует символ Z. Имена встроенных расширенных функций нечувствительны к регистру и могут быть сокращены.
Допустимые варианты сокращений указаны в описании каждой функции.
При выполнении пользовательской функции, возвращающей значение, значение системной переменной $test защищается от изменения на
предыдущем уровне стека. См. описание системной переменной $test.
1.4 Операторы
Операторами называются предопределённые конструкции языка, имеющие один или два аргумента и возвращающие значение путём вычисления соответствующего математического или иного действия над значениями операндов.
Операторы с аргументами могут быть использованы в любом месте,
где допустимо использование значения выражения.
Операторы могут классифицироваться на логические, арифметические и строковые, или иным образом на усмотрение программиста, поскольку стандарта деления операторов на группы нет.
14
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
Операторы обозначаются зарезервированными спецсимволами. Если
оператор имеет один аргумент, то он унарный и пишется перед аргументом. Если у оператора два аргумента, то он бинарный и пишется между
аргументами.
Между аргументами и символом оператора пробелы недопустимы.
Аргументы операторов, в свою очередь, могут быть значениями выражений, которые вычисляются с использованием констант, функций,
переменных и других операторов.
Действие операторов в MiniM не может быть переопределено.
Примеры операторов:
Сложение арифметическое: a+b
Умножение: a*b
Приведение к числу и смена знака: -a
Логическое отрицание: ’a
1.5
Выражения
Выражение - специальная конструкция языка, задающая правило вычисления значения. Значением является строка. Строка - результат выражения, она образуется применением операторов, использованием констант,
значений различного рода переменных и функций.
Выражение не ограничивается по степени сложности.
Выражение вычисляется слева направо в порядке записи либо порядок вычисления указывается явно круглыми скобками.
Если выражение формируется операторами, то их аргументы, в свою
очередь, также являются выражениями и вычисляются слева направо
либо в очередности, указанной круглыми скобками.
В случае если в выражении используется косвенность имени, то при
вычислении она полностью раскрывается и вычисляется до значения.
Значения индексов переменных также являются выражениями и вычисляются в очерёдности следования индексов слева направо.
Примеры выражений:
A+B*2
A+(B*2)
$tr(input," ")_":"_$j
^pos($j,"left")+offset
1.6. КОНСТАНТЫ
15
Значением выражения формально всегда является строка, но операторы в зависимости от назначения трактуют содержание операндов либо строго как строки, состоящие из последовательности байт, либо как
строковые представления чисел.
Поэтому могут быть построены выражения следующего типа "взять
первый байт строкового представления суммы" или умножить строки "12
метров" на "23 метра".
1.6 Константы
Константы - специальные элементы языка, задающие в коде командной
строки константное значение.
Константы могут быть заданы как строковые, числовые и шестнадцатеричные.
При задании строковой константы последовательность символов строки берется в двойные кавычки ("). Если в строке требуется задать символ двойной кавычки ("), то вместо него пишутся два символа двойной
кавычки (""). Остальные символы в строке пишутся как есть, за исключением специальных управляющих символов. В строке разрешается
набирать символ табуляции, если ввод поддерживается устройством ввода.
При задании числовых констант могут быть заданы либо целые числа
со знаком, либо числа с плавающей точкой. Разделителем целой и дробной части является символ точки (.), разделителем мантиссы и порядка
является символ e или E латинские.
При задании шестнадцатеричных констант пишется знак начала шестнадцатеричной последовательности (#), после которого следует сама
шестнадцатеричная последовательность, и она нечувствительна к регистру. Например:
#12eaCDFE
При компиляции кода программы в байт-код значения констант заносятся в специальную секцию байт-кода констант и используются, если в
программе встречается два или более раз константа с этим же значением. Это приводит к сокращению объёма байт-кода.
Использование констант есть использование значений выражений.
Константы не могут быть изменены и их нельзя передать по ссылке.
16
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
1.7
Специальные переменные
К специальным переменным (или системным переменным) относятся
специальные элементы языка, которые при чтении и записи ведут себя как переменные и имеют определённый стандартом и расширением
MiniM перечень.
Специальные переменные возвращают специальную информацию о
состоянии процесса и его элементов.
Специальные переменные начинаются на один символ $ и не имеют
параметров.
Расширенные системные переменные MiniM начинаются с одного
символа $ и следующей за ним буквы z.
Имена специальных переменных нечувствительны к регистру. Их
имена могут быть сокращены. Для каждой из них указано, какое сокращение допустимо.
Специальные переменные существуют всегда и не могут быть удалены. Их значения хранятся в специальном внутреннем представлении
или вычисляются.
В зависимости от назначения некоторые специальные переменные могут быть как присвоены, так и прочитаны, а некоторые только прочитаны. Значения специальных переменных могут быть использованы в
любых выражениях, где синтаксически допустимо использование выражения или значения.
В зависимости от назначения некоторые специальные переменные автоматически изменяют своё значение. На это влияет состояние процесса
или выполняемое им действие.
Примеры системных переменных:
Вернуть номер процесса: $j
Вернуть или установить координаты курсора: $x, $y
Вернуть имя последней глобальной ссылки: $zr
Вернуть новый GUID: $zguid
1.8
Структурные системные переменные
Структурные системные переменные - специальные элементы языка, которые синтаксически используются как переменные, имеют индексы и
возвращают специальную системную информацию о наличии и некоторых характеристиках элементов процесса или системы.
1.9. ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
17
Структурные системные переменные имеют предопределённый перечень имён и начинаются на символ ˆ$.
Имена структурных системных переменных нечувствительны к регистру. Их имена могут быть сокращены до одной буквы после символа
ˆ$.
Структурные системные переменные являются виртуальным внутренним объектом системы, и их подиндексы существуют при наличии соответствующих элементов.
Структурные системные переменные могут быть использованы в качестве аргументов функций $order, $query, $data, в некоторых специальных случаях - в качестве аргумента функции $get, а в некоторых
случаях - в качестве аргумента команды kill.
Для каждой поддерживаемой структурной системной переменной в
документации перечислены допустимые с ней операции.
Значения индексов структурных переменных зависят от типа этой
структурной переменной. Например, значения индексов переменной ˆ$ROUTINE
- это имена рутин, ˆ$LOCK - это имена переменных, а ˆ$JOB - номера
процессов.
Использование структурных системных переменных в качестве аргумента перечисляющих функций $order и $query позволяет получить
перечень специальных системных элементов, в качестве функции $data
- проверить существование элемента, а в качестве аргумента команды
kill - удалить этот системный элемент.
Например, удаление ˆ$LOCK, с указанием в качестве индекса имени
локальной или глобальной переменной, приводит к удалению блокировки, а удаление ˆ$JOB, с указанием в качестве индекса номера процесса,
приводит к принудительному завершению указанного процесса.
1.9 Локальные переменные
Локальные переменные есть специальный элемент языка, означающий
хранение информации в течение жизни процесса, доступной только ему
и никакому другому процессу.
Имена локальных переменных могут начинаться с символа процент
% или латинской буквы, за которыми могут следовать латинские буквы
или цифры.
Имена локальных переменных чувствительны к регистру.
Локальные переменные могут быть индексированными или неиндексированными.
18
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
Имена локальных переменных не требуется объявлять, переменные
создаются автоматически при первом присваивании.
Локальные переменные создаются командами set или read при первой
записи в них каких-либо значений. Локальные переменные удаляются
командой kill или автоматически командой quit, если переменная была
объявлена на уровне стека командой new, или командой new на том же
уровне стека, если переменная была заведена там же командой new.
В процессе могут быть объявлены несколько одинаковых имён локальных переменных, если они созданы командой new на разных уровнях стека. В этом случае, процесс работает с теми значениями, которые
находятся на ближайшем уровне стека.
Процесс MiniM поддерживает ограничение на общий объём памяти,
который могут занять локальные переменные. Общий объём доступной
памяти для локальных переменных возвращает системная переменная
$storage.
В отличие от всех остальных видов переменных корневые имена локальных переменных могут передаваться в подпрограмму по ссылке через точку так, что имена формальных параметров в подпрограмме оказываются синонимами переданных фактических параметров, и переданные
имена могут быть изменены в подпрограмме.
Значение локальной переменной может быть длиной до 32 килобайт.
Примеры имён локальных переменных:
%
%X
Aks
w67
height
pos(12,"start")
1.10 Глобальные переменные
Глобальные переменные (или глобалы) - это специальные объекты языка,
представляющие хранимые на диске данные.
Глобалы существуют и после окончания процесса, их создавшего, и
видны всем процессам сервера.
Данные глобалов хранятся на диске в файлах данных.
Доступ к глобалам оптимизирован. Данные кэшируются блоками по
8 килобайт.
1.10. ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
19
Операции с глобалами журналируются. Информация в журнале используется для отката транзакции и для восстановления базы данных в
корректное состояние.
Синтаксически глобальные переменные начинаются с символа циркумфлекса (ˆ), за которым следует необязательное указание имени базы
данных, заключённое в символы вертикальной черты, за которыми следует имя глобала. Если используется индексированное имя глобала, то
после имени пишутся круглые скобки, в которых перечисляются выражения, задающие значения индексов глобала. Опускать индексы не
допускается. Если имя базы данных явно не указано, то считается, что
глобал находится в текущей базе данных.
Имена глобалов чувствительны к регистру, а имена базы данных
нечувствительны к регистру. Имя глобала должно начинаться на символ
процента % или на латинскую букву, за которыми следуют необязательные латинские буквы или цифры.
Примеры:
^GG
^|"user"|GG
^|"user"|GG($j)
^|"user"|GG("name",12)
Для совместимости с иными реализациями M[UMPS] система MiniM
поддерживает задание имени базы данных не только символами вертикальной черты, но и символами квадратных скобок.
Примеры:
^["user"]GG
^["user"]GG($j)
^["user"]GG("name",12)
При этом функции, возвращающие полные имена глобалов, возвращают имя в канонической форме - имя базы данных в верхнем регистре,
заключённое в символы вертикальной черты.
Для имён глобалов система MiniM поддерживает встроенные правила отображения имён: 1) имена, начинающиеся с символа процент %,
физически всегда находятся в базе данных %SYS и 2) имена глобалов,
начинающиеся с символов mtemp, физически находятся в базе данных
TEMP.
MiniMono difference
В MiniM Embedded Edition поддерживается только одна база данных
%SYS и все глобалы хранятся только в ней.
20
1.11
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
Постусловные выражения
Постусловным выражением называется выражение, которое вычисляется перед выполнением команды и производится приведением результата вычисления к числу. После этого число сравнивается с нулем. Если
получилось число ноль, то команда не выполняется, если не ноль, то
выполняется.
Если команда имеет несколько аргументов, то действие постусловия
распространяется на все перечисленные у команды аргументы. Т.е. либо команда применяется ко всем аргументам слева направо, либо ни к
одному аргументу.
Если постусловие не выполнено, то управление переходит к следующей команде в строке.
Проверка постусловия не влияет на системную переменную $test, и
следует различать выполнение команды по постусловию или по выполнению команды if.
Выражение постусловия записывается после ключевого слова команды и отделяется от него двоеточием. Например:
cmd:postcond cmdarg1,cmdarg2
Здесь postcond - произвольное вычисляемое выражение, cmd - ключевое слово команды, cmdarg - аргументы команды.
Хотя постусловное выражение записывается после ключевого слова
команды, но вычисляется и проверяется перед выполнением или невыполнением команды.
Даже в случае если постусловное выражение не выполняется (результат вычисления равен нулю), тем не менее выражение вычисляется,
и вычисление может иметь побочные эффекты. На это программист обязательно должен обращать внимание.
Некоторые команды, например do или goto, также могут иметь постусловие на аргументы. Если постусловие аргумента не указано, то
команда применяется к нему, иначе, сначала вычисляется постусловие
аргумента, проверяется как число на равенство нулю, и в зависимости
от результата команда применяется к этому аргументу, либо применяется к следующему, если он есть. При этом если есть постусловие как на
аргумент команды, так и на команду, сначала вычисляется и проверяется постусловие на команду, затем, если оно выполняется, вычисляются
и проверяются постусловия на аргументы. Например:
do:pc label1:pc1,label2:pc2
1.12. ЧИСЛА И СТРОКИ
21
Здесь если выражение pc вычисляется как 0, то все аргументы и
постусловия аргументов игнорируются, и управление переходит к следующей команде. Иначе, далее вычисляется и проверяется постусловие
pc1, и если выполняется, то вызывается подпрограмма с метки label1.
После обработки первого аргумента управление переходит ко второму,
вычисляется и проверяется постусловие pc2. Если оно выполняется, то
вызывается подпрограмма с метки label2.
Постусловия на аргументы, также, являются выражениями и могут
иметь побочные эффекты. Постусловия на аргументы не влияют на системную переменную $test.
1.12
Числа и строки
Система MiniM придерживается стандартов языка M[UMPS], в том числе и в трактовке чисел и строк. Формально все значения являются строками, то есть последовательностями байт. При этом, в соответствии со
стандартом, значение, в зависимости от контекста применения, может
рассматриваться как число. В этом случае строка рассматривается как
строковое представление числа, и MiniM использует это число.
Для приведения строки к числу рассматривается первая часть строки, подходящая под шаблон числа. Приведение бывает двух видов: арифметическое и каноническое. В арифметическом приведении результатом
всегда является число, в каноническом результатом является число только в случае, если строка содержит каноническое представление числа по
стандарту M[UMPS] - отсутствуют лидирующие знаки, кроме первого
знака минус, отсутствуют лидирующие и завершающие нули, и после
числа в строке нет иных символов. В арифметическом приведении принимаются все лидирующие последовательности знаков, а все лидирующие
и завершающие нули и символы строки после шаблона числа отбрасываются. Если строка начинается не на шаблон числа, в том числе пустая
строка, то она приводится к значению 0.
Арифметическое приведение выполняется по контексту арифметическими операциями или системными функциями, если они по определению ожидают число.
Каноническое приведение выполняется при использовании строк в
качестве значений индексов. Если строка содержит число в канонической
форме, то значение индекса считается числовым, иначе строковым.
Примеры канонических приведений могут быть продемонстрированы
в использовании различных представлений одного и того же, с точки
зрения арифметики, числа:
22
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
TEMP>s a("0.1")="0.1"
TEMP>s a("0.10")="0.10"
TEMP>s a(".1")=".1"
TEMP>s a(".10")=".10"
TEMP>w
a(.1)=".1"
a(".10")=".10"
a("0.1")="0.1"
a("0.10")="0.10"
Здесь лишь переменная a(.1) имеет числовой индекс, остальные имеют строковый индекс.
В случае если операция использует строковое значение, а в результате предыдущей операции получено число, система MiniM проводит автоматическое преобразование числа в строку. При этом выполняется приведение в каноническую форму. В результате отсутствуют лидирующие
и завершающие нули и опускается знак +, если число положительное.
В качестве таких операций, автоматически переводящих число в строку,
можно привести операцию конкатенации или функцию $length():
TEMP>w 0.2*3_4
.64
TEMP>w $l(0.2*3)
2
1.13
Индексы
В языке M[UMPS] локальные, глобальные и структурные системные
переменные могут быть индексированы и образовывать условное дерево.
Каждый узел такого дерева определяется именем и полным набором
значений индексов в определённом порядке. В каждом таком узле может
быть записано значение.
Система MiniM придерживается соглашения, что если в узле нет данных (значений), то этот узел не существует, однако могут существовать
его потомки. Примеры:
a(12,34)="456789"
1.14. ГОЛАЯ ССЫЛКА
23
^GL78("date")="78,89"
^GL78("date","oper",25)="127.0.0.1^80^4523"
В качестве значения могут использоваться произвольные строки или
последовательности байт длиной до 32 килобайт. В качестве значений
индексов могут использоваться также произвольные строки и числа, но
не пустая строка. На индексы налагаются более сложные ограничения:
общее количество индексов не может быть больше 63, а общая длина
имени не может быть больше 255 байт.
Для оперирования индексированными переменными и их именами
предоставляются функции перечисления значений индексов ($order() и
$query()), функция проверки существования индекса ($data(reference)),
а также функции разбора индексированного имени ($qs(name,pos)) и
функция конструирования индексированного имени (set $qs(name,pos)
= value).
Во внутреннем представлении данных система MiniM поддерживает
автоматические средства, сортирующие индексы по порядку, определяемому индексной сортировкой. Она определена следующим образом: самым младшим значением является пустая строка, она сортируется перед
всеми другими значениями, после неё идут числа в каноническом представлении, они сортируются по числовому возрастанию, за ними идут
все остальные строки, они сортируются в порядке, заданном текущей
национальной таблицей.
Текущая таблица сравнения задаётся файлом .N, который находится
в подкаталоге nat. Указание, какой из файлов сравнения использовать,
находится в настройках сервера: файл minim.ini, секция Server, ключ
Locale. В нём указывается имя файла без расширения.
Таблица сравнения применяется сервером (всеми процессами) единым образом как к глобалам, так и к локальным переменным при записи
данных, а также всегда при использовании оператора "следует после".
При выборке данных используется как таблица сравнений, так и тот
порядок следования, который был использован при вставке.
При удалении узла индексированной переменной командой kill система MiniM придерживается стандартного правила - "удаляется само
значение и все его потомки".
1.14
Голая ссылка
Голая ссылка (или naked indicator) - это имя глобальной переменной, к
которой последней производилось обращение. Для каждой из функций,
24
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
обращающихся к глобальным именам, описано поведение, взводится или
нет индикатор голой ссылки. Например, функция $data() взводит голую
ссылку даже если имя, к которому было обращение, не существует.
При старте процесса индикатор голой ссылки равен пустой строке.
При смене базы данных индикатор голой ссылки присваивается пустой строке.
У каждого процесса значение индикатора голой ссылки своё собственное, оно возвращается системной переменной $zreference.
Процесс может изменить значение голой ссылки явным присваиванием системной переменной $zreference либо имени глобальной переменной, либо пустой строки. В случае присвоения строки, не являющейся
корректным именем, генерируется ошибка синтаксиса <SYNTAX>.
Значение голой ссылки используется специальной синтаксической
конструкцией, состоящей из символа циркумфлекса и следующих за ним
значений индексов в круглых скобках. Например:
^("date")
^(456,$h)
Голая ссылка может быть использована в любом месте, где допустимо
использование имени глобальной переменной.
При использовании голой ссылки реальное имя глобальной переменной образуется в момент использования имени с голой ссылкой. На это
правило программисты должны обязательно обращать внимание - голая
ссылка раскрывается не в порядке вычисления выражения, а в момент
её использования. Например, при присваивании значения голой ссылки
значения из глобальной переменной
set ^(12)=^G(34)
сначала производится чтение из глобальной переменной, изменяется значение голой ссылки, а затем выполняется конструирование полного имени для присваивания. То есть имя присваивания получится как производное от ˆG (в данном примере), а не будет использовано то значение
голой ссылки, которое было до выполнения команды set.
При использовании голой ссылки имя глобальной переменной образуется по правилу: последний индекс голой ссылки замещается на первый
указанный индекс, остальные индексы дописываются к имени. Например:
TEMP>s $zr=$na(^a(12))
1.15. КОСВЕННОСТЬ
25
TEMP>w $na(^(34,56))
^a(34,56)
Поэтому, при использовании голой ссылки в двух случаях генерируется ошибка <NAKED>: 1) если значение голой ссылки есть пустая
строка и 2) если у голой ссылки нет индексов.
Использование индикатора голой ссылки, с одной стороны, может
сильно запутать чтение программы и понимание её работы, с другой
стороны, её же сильно упростить, если индикатор используется легкочитаемым образом. Кроме того, при использовании голой ссылки программист должен обращать внимание на возможные побочные результаты
обращения к глобальным именам.
1.15
Косвенность
Косвенность это элемент языка, позволяющий задавать синтаксический
элемент путем использования вместо его имени или части имени вычисляемого выражения.
Косвенность может как усложнять понимание программ так и упрощать, в зависимости от корректности ее применения.
Косвенность в языке MUMPS бывает:
* косвенность имени
* косвенность паттерна
* косвенность аргумента команды
* косвенность индексов
* косвенность функции $text()
Если процесс при исполнении встречает конструкцию с косвенностью, то аргумент косвенности вычисляется как выражение и результат
используется как подстановка вместо косвенного выражения.
Косвенность имени
Косвенность имени может быть использована в любом месте где ожидается имя переменной. Вычисленный аргумент косвенности используется как само имя. Например
USER>s abc=123,name="abc",var=@name
USER>w
abc=123
name="abc"
26
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
var=123
Здесь была использована косвенность имени в выражении @name.
Значение выражения name было вычислено как "abc" и эта строка была
использована в качестве имени.
При использовании косвенности имени выражение может возвращать
имя с индексами.
Косвенность паттерна
При использовании косвенности паттерна сопоставления вычисленно
значение используется в качестве паттерна. Например:
s pat="1N"
w 3?@pat
Здесь выполняется вычисление выражения pat и в действительности
выполняется сопоставление по шаблону 3?1N.
Косвенность аргумента команды
При использовании косвенности аргумента команды вычисленное выражение рассматривается как аргумент или несколько аргументов разделенных запятыми, к которым нужно применить эту команду. Например:
USER>s value="a=123",@value
USER>w
a=123
value="a=123"
Здесь команда set применяется в виде косвенности аргумента к строке вычисляемой как "a=123" и выполняется в действительности команда
set a=123.
Косвенность индексов
При косвенности индексов к имени вычисляемому косвенно могут
быть добавлены индексы, например:
USER>s name="a(1,2,3)",@name@(4,5,6)=123456
USER>w
a(1,2,3,4,5,6)=123456
name="a(1,2,3)"
1.16. ПРОГРАММЫ
27
Здесь производится вычисление выражения name как имени и к полученному имени добавляются дополнительные индексы. Результат используется как имя переменной.
Косвенность функции $text()
В косвенности функции $text() аргумент функции может быть задан
косвенно как вычисляемое выражение или любая часть аргумента может
быть задана косвенно. Примеры:
s label="LABEL^RTN"
w $text(@label)
w $text(@$p(label,"^",1)^@$p(label,"^",2))
w $text(@$p(label,"^",1)^RTN)
Здесь в первом случае использвана косвенность всего аргумента, во
втором раздельная косвенность метки и рутины, а в третьем косвенность
только метки.
1.16
Программы
Программы (или рутины) - это специальный элемент базы данных, содержащий последовательность командных строк в определённом порядке.
Строки программы состоят из строк, в начале которых ставится пробельный символ либо начинаются с метки строки.
Программы сохраняются, редактируются, компилируются, экспортируются и импортируются целиком.
Система MiniM является интерпретатором компилирующего типа.
Исполняется только предварительно откомпилированный код. Если при
исполнении (интерпретации) командной строки строка компилируется
целиком как одна строка, то при исполнении программы или её части
исполняется (интерпретируется) скомпилированный ранее байт-код, порождённый компилятором. Для исполнения байт-кода исходный текст
программы не требуется, за исключением отдельных случаев применения функции $text().
Исходный текст программ хранится в глобалах ˆROUTINE в каждой
базе данных. Скомпилированный байт-код хранится в глобалах ˆrOBJ в
той же базе данных.
Для имён программ действует соглашение автоматического отображения программ, имена которых начинаются на символ процента %. Такие программы физически хранятся в базе данных %SYS и видны всем
процессам, независимо от их текущей базы данных.
28
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
Имя программы может начинаться на символ процента % или латинскую букву, за которыми следуют латинские буквы или цифры. Длина
имени программы должна быть меньше или равна 31 символу. Имена
программ чувствительны к регистру, программы с разными именами являются разными программами.
Метка строки в программе может быть использована как имя подпрограммы. На неё (или со смещением от неё) можно перейти командой
goto или вызвать как подпрограмму с передачей метке параметров.
Имена меток в пределах одной программы должны быть уникальны.
Имена меток чувствительны к регистру.
В рамках программы может существовать элемент языка, который не
существует в командной строке - это блочный синтаксис. Если строка
начинается с символа точки, то одна или несколько таких строк образуют блок, который сам является подпрограммой и может быть исполнен
безаргументной формой команды do. При исполнении блока автоматически создаётся новый уровень стека. Блоки могут быть вложены друг в
друга, в этом случае в начале строки после первого пробельного символа
ставится соответствующее количество точек. Между точками пробелы
могут как присутствовать, так и отсутствовать. Например:
label(param)
new i
for i=1:1:param do
. write i,!
quit
quit:i>5
Здесь безаргументная форма команды do начинает исполнение подпрограммы в виде блока строк, указанных точками. После того, как
окончатся строки, с соответствующим количеством точек, выполнение
блока прекращается, выполняется возврат из подпрограммы. В строке
после безаргументной команды do, как в примере, также могут следовать другие команды.
При окончании выполнения строки команд программы управление автоматически передаётся на следующую за ней строку программы. Если
достигнут конец программы, то выполняется команда quit. Если подпрограмма выполняется в контексте ожидания возврата ($quit=1), то
выполняется неявная команда quit "", иначе выполняется неявная безаргументная команда quit. Те же самые действия выполняются, если при
переходе на следующую строку обнаруживается, что строка имеет метку
с параметрами.
Синтаксически вызов программы или подпрограммы указывается именем программы после символа циркумфлекса: ˆRoutineName. Если имя
1.16. ПРОГРАММЫ
29
базы данных программы не указано, то ищется программа в текущей
базе данных. Имя базы данных можно указать явно в символах вертикальной черты:
^|DbName|RoutineName,
где dbname - вычисляемое выражение произвольной сложности. Имена
баз данных используются нечувствительно к регистру. В простых случаях используют явную константу. Например:
do ^|"MINIM"|Sample()
Имена меток пишутся перед символом циркумфлекса:
LabelName^|DbName|RoutineName
Если имя метки опущено, то это означает ссылку на первую строку
программы. Между именем метки, за которым следует знак + и символом циркумфлекса, может быть указано смещение (обязательно положительная величина):
LabelName+Offset^|DbName|RoutineName,
где offset - произвольное выражение, вычисляемое как целое число.
При использовании меток вместе со смещением не допускается использовать параметры.
После компиляции программы образуется её байт-код, который хранится в виде строки в глобале ˆrOBJ. Соответственно, существует ограничение на размер одной программы - порождаемый при её компиляции
байт-код не должен превышать по размеру 32 килобайт.
В случае если программист сталкивается с таким ограничением, ему
следует разнести подпрограммы по разным программам (рутинам).
При использовании программ система MiniM производит кэширование байт-кода программ. Один и тот же байт-код используется всеми
процессами сервера. Размер кэша рутин устанавливается в файле настроек minim.ini. Байт-код рутин кэшируется по алгоритму LRU.
MiniMono difference
В MiniM Embedded Edition поддерживается только одна база данных
%SYS и все рутины и их компилированный байткод хранится только в
этой базе.
30
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
1.17
Метки
Метками называются последовательности символов, задающие именование строки в тексте программы. Метки начинаются с первого символа
строки, могут начинаться на символы процента %, цифру или латинскую
букву, за которыми следуют необязательные латинские буквы или цифры. Имена меток в тексте одной программы должны различаться. Имена
меток чувствительны к регистру.
Метка может иметь или не иметь параметры. В тексте программы
параметры метки есть формальные параметры. Параметры заключаются
в круглые скобки после имени метки.
Метку можно использовать для вызова подпрограммы командой do,
для вызова как функции, возвращающей значение, через синтаксис $$ и
для безусловного перехода по команде goto. Для перехода по goto метка
не должна иметь параметров.
Примеры программ с метками:
FUNC(a,b) q a+b*2
%NAME q $p($zv," ")
; 1
; 2
Здесь в первом примере описана метка FUNC, принимающая два
формальных параметра a и b. Эту метку можно вызвать как $$FUNC(),
передав ей фактические параметры. Во втором примере описана метка
%NAME, она не имеет параметров и её требуется вызывать без указания
параметров: $$%NAME.
В той же строке, что и метка, могут находиться команды. При этом
перед первой командой должен быть, по меньшей мере, один пробельный символ. При переходе управления на метку начинают исполняться
команды, следующие непосредственно за описанием параметров метки.
Вызовы меток без возвращаемого значения через команду do и с
возвращаемым значением определяются вызывающей стороной. Подпрограмма вызываемой стороны может определить, в каком контексте была вызвана подпрограмма, используя системную переменную $quit. В
случае если ожидается возврат, подпрограмма должна вернуть значение
командой quit с параметром - значением возврата, иначе подпрограмма
должна вернуть управление командой quit без параметров.
На вызывающей стороне, после указания имени метки, следуют указание смещения и имя рутины, в которой эта метка находится. Если
вызывается метка с параметрами, то указывать смещение недопустимо.
1.18. ПЕРЕДАЧА ПАРАМЕТРОВ
31
Имя метки, смещение и имя рутины могут быть опущены, если оставшейся части полного имени достаточно для вызова. Если имя рутины
опущено, то считается, что используется текущая рутина.
Примеры:
do LABEL^RTN
; 1
goto LABEL+3^RTN
; 2
g 12+4
; 3
do ^RTN
; 4
w $$FUNC^RTN($h,ver) ; 5
Здесь в первом примере вызывается подпрограмма без параметров в
рутине RTN с метки LABEL, во втором примере выполняется безусловный переход на третью строку после строки с меткой LABEL в рутине
RTN, в третьем примере выполняется переход на четвёртую строку после метки 12 в текущей рутине, в четвертом примере вызывается подпрограмма с первой имеющейся строки в рутине RTN, в пятом примере
вызывается подпрограмма с метки FUNC в рутине RTN с ожиданием
возврата и с передачей в качестве параметров значений системной переменной $horolog и локальной переменной ver.
Если не указаны ни метка, ни смещение, то управление передаётся
на самую первую строку программы.
При вызове меток допустимо использовать косвенность, указывая
косвенно любые части полного синтаксиса меток. Пусть имя метки будет
в переменной label, а имя рутины - в переменной rtn, тогда предыдущие
примеры будут выглядеть так:
do @label^@rtn
; 1
goto @label+3^@rtn
; 2
g @label+4
; 3
do ^@rtn
; 4
w $$@label^@rtn($h,ver) ; 5
1.18 Передача параметров
При передаче параметров метке и при вызове подпрограммы производится сопоставление фактических параметров, указанных на вызывающей
стороне, формальным параметрам, указанных на вызываемой стороне.
В качестве фактических параметров могут использоваться пропуски
параметров, передача значений выражений и передача корневых имён
32
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
локальных переменных по ссылке. В последнем случае синтаксически
указывается, что передаётся имя по ссылке, а не значение локальной
переменной с указанием перед именем точки. При этом передавать по
ссылке индексированные локальные переменные не допускается.
Количество формальных и фактических параметров не обязано совпадать. Фактически параметры сопоставляются формальным позиционно.
Если фактических параметров передано меньше, чем формальных, то
оставшиеся формальные параметры принимают неопределённое значение.
Формальные параметры синтаксически указываются как имена неиндексированных локальных переменных. При получении управления следующей после метки командой эти локальные переменные существуют
на текущем уровне стека и при возврате с уровня автоматически уничтожаются.
При пропуске фактических параметров формальный параметр принимает неопределённое значение.
MiniM поддерживает два механизма расширения стандарта языка
M[UMPS]: 1) автоматическое присваивание значений неопределённым
параметрам и 2) приём неопределённого количества параметров.
Автоматическое присваивание
Если формальный параметр после сопоставления принимает неопределённое значение, то можно указать, какое значение в этом случае ему
необходимо автоматически присвоить. Синтаксически указывается имя
формального параметра, символ присваивания = и следующая за ним
константа.
Пусть есть такая подпрограмма:
LABEL(v=123)
q v
Её можно вызвать как
$$LABEL()
; 1
$$LABEL(2)
; 2
$$LABEL(3,8) ; 3
Здесь в первом случае не передаётся фактический параметр и переменная v принимает неопределённое значение, которой автоматически
присваивается значение 123. Во втором случае переменной v присваивается значение 2 и оно по умолчанию игнорируется. В третьем случае
1.18. ПЕРЕДАЧА ПАРАМЕТРОВ
33
переменной v значение сопоставляется, но для второго параметра метка
ничего не принимает, поэтому генерируется ошибка <PARAMETER>.
Неопределённое количество параметров
Для того чтобы метка могла принять неопределённое количество параметров, её последний формальный параметр специфицируется тремя
точками:
LABEL(p1,params...)
В этом случае, при сопоставлении фактических параметров формальным, игнорируется передача локальных переменных по ссылке и принимаются только значения. Значение переменной, указанной тремя точками (в примере params), принимает значение количества принятых фактических параметров, начиная с этой позиции. Принимаемые значения
записываются в индексы переменной (в примере это params), начиная
с индекса 1 и так далее в порядке следования. Если, начиная с этой
позиции, не было фактических параметров, то формальная переменная
принимает неопределённое значение. Если были пропуски фактических
параметров, то соответствующие узлы формальной переменной не создаются и имеют неопределённое значение.
Например, пусть есть подпрограмма:
LABEL(params...)
zw params
q params
Тогда при её вызове получаем:
USER>w $$LABEL^test(1)
params=1
params(1)=1
1
USER>w $$LABEL^test(1,2)
params=2
params(1)=1
params(2)=2
2
USER>w $$LABEL^test("we",2)
params=2
params(1)="we"
params(2)=2
34
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
2
USER>w $$LABEL^test(,2)
params=2
params(2)=2
2
Программистам следует учитывать, что автоматическое присваивание
значений и приём неопределённого количества параметров не входят с
стандарт языка M[UMPS], что их использование может создать препятствие при переносе программ на другую M систему.
1.19 Комментарии
Комментарием является фрагмент строки программы от символа (;) до
конца строки.
Перед символом комментария обязательно должна быть пробельная
последовательность из, по крайней мере, одного символа пробельного
класса - пробел или табулятор.
Комментарий может начинаться в любом месте строки программы,
где может быть использована команда.
Комментарий синтаксически рассматривается как окончание строки.
Все символы, следующие за символом комментария до конца строки,
не принимаются исполняющей машиной к исполнению.
Если комментарий начинается не на один символ точки с запятой, а
на два или более, то эта строка полностью при компиляции сохраняется
в байт-коде и впоследствии может быть получена функцией $text без
наличия исходного текста программы. При этом занимаемый на диске
размер байт-кода увеличивается для хранения этой строки.
Комментарий может быть использован как в строке программы, так и
в строке аргумента команды xecute, при этом строка исполнения может
начинаться с символа комментария без пробельной последовательности
перед ним. В строке xecute вся последовательность символов после символа комментария игнорируется.
1.20 Блокировки
Блокировками называются внутренние объекты сервера, которые могут
быть созданы и проверены на существование. Блокировки именуются и
имеют имена, структурно полностью аналогичные именам локальных и
глобальных переменных.
1.20. БЛОКИРОВКИ
35
Блокировка устанавливается и снимается командой lock. Имя и характер блокирования определяются аргументами команды.
Для выполнения блокирования имени сама переменная не используется. Она может как существовать, так и не существовать, и доступ к
переменной с таким же именем как у блокировки не препятствуется.
При установлении блокировок система MiniM проверяет правила, что
разные процессы не могут блокировать одинаковые имена и имена, состоящие в подчинении. При этом два процесса могут блокировать различные имена, не являющиеся дочерними друг другу. Например, если
первый процесс блокировал имя a(12,34), то второму процессу не будет
позволено блокировать имена a(12,34) по первому правилу и имена a,
a(12) по второму правилу, а также все имена, образованные из a(12,34)
дописыванием произвольных индексов. При этом второму процессу будет
позволено блокировать имена, отличающиеся от имени a(12,34) последним индексом, например a(12,45) или a(12,67).
Блокировки существуют как внутренние объекты сервера и принадлежат процессу их установившему. При окончании процесса все блокировки, которые он установил, автоматически снимаются им же. В случае
аварийного завершения процесса сервер автоматически запускает служебный процесс очистки внутренних объектов, в том числе блокировок.
Имена блокированных переменных могут быть перечислены, используя структурную системную переменную ˆ$L[OCK]. Следует обратить
внимание, что информация о блокировках получается не единым списком. И в течение перечисления блокировки могут как создаться, так
удалиться, поскольку MiniM является многопроцессным сервером с параллельным исполнением процессов.
Каждая блокировка имеет счётчик блокирований. Установление простой блокировки устанавливает счётчик в единицу. Установление инкрементальной блокировки увеличивает счётчик на единицу либо создаёт
блокировку с этим именем, если её не было, и ставит счётчик в единицу. При чтении значения структурной системной переменной ˆ$L[OCK]
с указанием имени блокировки система MiniM возвращает номер процесса владельца блокировки и счётчик блокирований.
Блокировки могут быть установлены списком таким образом, что система ожидает выполнения условий блокирования для всех перечисленных в списке имён. И блокировка применяется либо ко всем именам,
либо ни к одному из них.
При установке блокировки может задаваться необязательный таймаут ожидания условия блокирования. Если тайм-аут не указывается, то
процесс ожидает выполнения условия, пока оно не наступит, а если указан, то ожидает в течение тайм-аута. Если в течение тайм-аута условие
36
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
не наступило, то блокировка не выполняется, и системная переменная
$test принимает значение 0, если выполняется, то блокировка устанавливается, и системная переменная $test принимает значение 1. Используя
эту переменную, программист может проверить, произведена ли блокировка с тайм-аутом.
Блокировки являются стандартным механизмом языка M[UMPS] и
позволяют писать программы, корректно выполняющие доступ к элементам базы данных и внешним устройствам в соответствии с логикой
конкурентного доступа.
Система MiniM расширяет стандартный механизм блокировок, позволяя использовать структурную системную переменную ˆ$L[OCK] как
для получения информации о процессе - владельце блокировки и счетчике блокирований, так и удалять блокировку, установленную другим
процессом. Что позволяет составлять программы снятия спорных блокировок в случае мертвых блокировок (deadlock).
1.21
Устройства ввода-вывода
Система MiniM согласно стандарту M[UMPS] поддерживает устройства
ввода-вывода. Каждый процесс может открывать и закрывать несколько
устройств ввода-вывода и владеть ими одновременно. Открытое процессом устройство принадлежит ему. При завершении процесса открытые
им (или автоматически для него) устройства автоматически закрываются.
Устройство ввода-вывода идентифицируется строкой идентификации
устройства. Общее строение строки:
|префикс типа|уточнение устройства
Все команды открытия, использования и закрытия оперируют строкой
идентификации устройства ввода-вывода с использованием необязательных параметров.
В качестве префикса, он же является указанием типа устройства, в
текущей версии могут использоваться предопределённые строки:
CON
FILE
NULL
Процесс производит ввод-вывод через стандартную
консоль Windows, интерактивное устройство.
Ввод-вывод проводится через дисковый файл файловой системы.
Пустое устройство, утрачивающее вывод и не имеющее ввода.
1.21. УСТРОЙСТВА ВВОДА-ВЫВОДА
PIPE
STD
TCP
TNT
37
Межпроцессное устройство, передающее и принимающее поток данных для других консольных программ.
Стандартное устройство ввода-вывода для пакетного
режима, возможен интерактивный режим.
Ввод-вывод проводится через TCP/IP сокеты.
Ввод-вывод проводится через TCP/IP сокеты по протоколу telnet, интерактивное устройство.
Строка уточнения устройства задаёт конкретное имя устройства и
рассматривается в зависимости от типа устройства. Например, для типа FILE - это имя файла файловой системы, для PIPE - это команда
операционной системы, а для TCP - это имя сервера и порт.
Некоторые из типов устройств (CON, TNT, STD) создаются системой
MiniM автоматически при старте процесса, в зависимости от условий его
запуска.
К интерактивным устройствам относятся устройства, принимающие
ввод непосредственно при клавиатурном вводе оператора либо непосредственно (STD и CON), либо через удалённый клиент (TNT). Для интерактивных устройств TNT и CON поддерживается позиционирование
курсора ввода-вывода и улучшенные средства ввода строк.
Одно из устройств процесса создаётся системой автоматически. Например, для процесса, запущенного командой job в простой форме, создаётся устройство NULL, а при запуске процесса командой операционной
системы minim.exe без параметров создаётся устройство CON. При этом,
это автоматически созданное устройство не может быть закрыто, команда его закрытия игнорируется. Такое устройство называется устройством
по умолчанию (principal). Строка идентификации устройства по умолчанию возвращается системной переменной $p[rincipal].
Согласно стандарту M[UMPS] ввод-вывод осуществляется через так
называемое текущее устройство ввода-вывода. Для того чтобы провести
ввод или вывод через открытое устройство, оно либо должно быть текущим, либо его следует сделать текущим, используя команду use. Строка
идентификации текущего устройства возвращается системной переменной $i[o].
Система MiniM в целях совместимости с другими M[UMPS] системами поддерживает для команды use строку идентификации 0, означающую использование устройства ввода-вывода по умолчанию. Команда
use 0 функционально эквивалентна команде use $p.
При закрытии устройства, которое является текущим и не является устройством по умолчанию, система MiniM закрывает его и делает
38
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
текущим устройство по умолчанию.
При работе процесса в интерактивном режиме после окончания выполнения строки команд система MiniM автоматически делает текущим
устройством устройство по умолчанию. При этом открытые процессом
устройства не закрываются и продолжают оставаться открытыми и принадлежат процессу.
Система MiniM поддерживает возможность одновременного использования несколькими процессами устройств ввода-вывода с одинаковыми строками идентификации. Каждое из устройств принадлежит только
процессу. Например, два или более процессов могут писать в один и
тот же файл, но в его разные места, и использовать блокировки одного и того же файла или использовать межпроцессное устройство PIPE,
запуская одну и ту же команду операционной системы.
Перечень устройств ввода-вывода, принадлежащих процессу, всегда
доступен через структурную системную переменную ˆ$D[EVICE].
Ввод из устройства производится только из текущего устройства и
командой read. Читать можно как символ, так и строку.
Вывод в устройство производится только в текущее устройство и
командой write. Выводить можно как код символа, так и строку.
Команды read и write, кроме ввода и вывода символов и строк, могут выводить также специальные последовательности, например перевод
строки или очистку экрана.
Команда чтения read, несмотря на своё название, может производить
вывод в некоторых случаях, например при передаче ей спецификаторов
управления форматом или констант, строковых или числовых. Например:
read !,"Input file name: ",fname
Здесь команда выводит перевод строки, затем строку "Input file name:
" и лишь затем вводит из текущего устройства строку в переменную
fname.
1.22 Параметры устройств ввода-вывода
Команды открытия (open), использования (use) и закрытия (close) могут
принимать дополнительные параметры, уточняющие, как именно следует
оперировать устройством, либо назначить ему дополнительно какие-то
параметры.
Параметры устройств синтаксически задаются через двоеточие после
строки идентификации устройства. Если параметр только один, то он
1.23. МНЕМОНИКИ УСТРОЙСТВ ВВОДА-ВЫВОДА
39
может указываться как есть или в круглых скобках, а если несколько, то обязательно все параметры должны браться в круглые скобки и
разделяться друг от друга двоеточием.
Параметры могут задаваться двумя способами - именованно или позиционно. У параметра могут быть или могут не быть значения. MiniM
распознаёт позиционно заданные параметры по позиции. Если параметр
задан именованно, то его задание имеет приоритет над позиционным
заданием. При позиционном задании указываются лишь значения параметров. Например:
u file:"WT"
u file:("WT")
u file:(/MODE="WT")
u socket:/ACCEPT
; 1
; 2
; 3
; 4
Здесь перечислены варианты использования параметров. Первый вариант - задание параметра позиционно. Параметр один, поэтому круглые
скобки необязательны. Второй вариант - то же самое, но параметр взят
в круглые скобки. В третьем варианте параметр задан именованно. В
четвёртом варианте параметр указан именованно и не имеет значения.
Имена, значения и позиционность параметров для команд open, use
и close описаны для каждого типа из поддерживаемых MiniM устройств
ввода-вывода. Если в имени параметра сделана опечатка, то он в текущей версии не опознаётся и игнорируется.
Применение параметров, в зависимости от типа устройства, и значение параметра может как изменять текущие настройки устройства, так и
выполнять какие-то действия. Например, параметры /MODE и /TERM
изменяют текущие настройки режима и терминатор, а параметры /LOCK
и /ACCEPT выполняют действия по блокированию файла и accept сокета.
Система MiniM поддерживает операции над устройствами через параметры в целях поддержания синтаксической корректности кода без
размножения специфических для реализации функций $view().
1.23
Мнемоники устройств ввода-вывода
Мнемониками называются специальные синтаксические конструкции,
аргументы команд read и write. Начинаются с символа (/), за которым следует имя мнемоники и необязательные аргументы. Аргументы
задаются вычисляемыми выражениями. Мнемоники задают смысловое
40
ГЛАВА 1. СИНТАКСИС ЯЗЫКА
действие ввода-вывода, например вывести в текущее устройство последовательность, позиционирующую курсор в зависимости от типа текущего
устройства.
Для устройства может быть назначена программа обработки мнемоник. Тогда, при использовании мнемоник команды read и write автоматически вызывают подпрограммы в этой программе мнемоник с тем, чтобы
эти подпрограммы формировали требуемые для устройства последовательности, а код ввода - вывода остаётся неизменным. Например:
write /CUP(12,20)
read /CUP(12,20)
позиционирует курсор на интерактивном устройстве в указанные координаты. Независимо от текущего устройства код вывода неизменный,
но для устройства консоли и телнета управление положением курсора
может немного отличаться.
Рутина обработки мнемоник может задаваться либо автоматически
в настройках устройств в файле настроек minim.ini, либо указываться
в параметрах команды открытия устройства open, либо указываться в
параметрах использования устройства use. После того как рутина обработки задана, она продолжает применяться до закрытия устройства либо
до следующей смены рутины.
Мнемоники могут быть организованы таким образом, что образуют
библиотеки подпрограмм ввода-вывода с едиными именами так, что код
вывода остаётся независимым от типа устройства.
В рутине обработки мнемоник для каждой мнемоники должны быть
созданы метки с параметрами или без них, в зависимости от назначения
мнемоник. При использовании мнемоники MiniM автоматически производит вызов метки через do с передачей фактических параметров, если
они указаны. В рутине обработки мнемоники параметры принимаются
по значению как формальные. При возврате управления из этой вызываемой подпрограммы команды read и write продолжают обработку своих
аргументов.
Глава 2
Операторы
2.1
Унарный плюс (+)
Преобразует строку - операнд в число.
Синтаксис
+ expr
Определение
Унарный оператор плюс (+) преобразует значение аргумента в число. Аргумент рассматривается как последовательность из трёх последовательностей: последовательность знаков + или -, задающих знак числа, последовательность цифр, десятичной точки и экспоненты числа и
остальные символы, не являющиеся представлением числа.
Оператор унарный плюс использует лидирующие знаки (первая последовательность) для вычисления знака числа и вторую последовательность для вычисления значения числа. Третья последовательность отбрасывается. Оператор не изменяет значение аргумента, возвращает новое
вычисленное значение. Оператор унарный плюс может применяться к
любому вычислимому выражению.
Возвращаемое оператором унарный плюс значение является каноническим представлением числа с одним знаком, если число отрицательное, и без завершающих нулей после десятичной точки. Значение 0 представляется без знака.
Примеры:
TEMP>w +"123"
123
41
42
ГЛАВА 2. ОПЕРАТОРЫ
TEMP>w +"--123"
123
TEMP>w +"-++-+-123"
-123
TEMP>w +"-++-+-123.23"
-123.23
TEMP>w +"123.23e12"
123230000000000
TEMP>w +"123.23e1 ff"
1232.3
TEMP>w +" 123.23e1 ff"
0
2.2 Сложение (+)
Выполняет сложение двух аргументов и возвращает результат.
Синтаксис
expr1 + expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор сложения приводит оба аргумента к числам и возвращает результат их сложения. В случае если выполнить сложение невозможно по причине переполнения, оператор генерирует ошибки <MAXNUMBER>, <MINNUMBER>.
Примеры:
TEMP>w "--123"+"--456"
579
TEMP>w "1a"+"2b"
3
TEMP>w "a"+"b"
0
2.3
Унарный минус (-)
Преобразует строку - операнд в число.
Синтаксис
2.4. ВЫЧИТАНИЕ (-)
43
- expr
Определение
Оператор унарный минус (-) преобразует значение аргумента в число. Аргумент рассматривается как последовательность из трёх последовательностей: последовательность знаков + или -, задающих знак числа, последовательность цифр, десятичной точки и экспоненты числа и
остальные символы, не являющиеся представлением числа.
Оператор унарный минус использует лидирующие знаки (первая последовательность) для вычисления знака числа и вторую последовательность для вычисления значения числа. Третья последовательность отбрасывается. Оператор изменяет знак вычисленного выражения как числа
на обратный. Оператор не изменяет значение аргумента, возвращает новое вычисленное значение. Оператор унарный минус может применяться
к любому вычислимому выражению.
Возвращаемое оператором унарный минус значение является каноническим представлением числа с одним знаком, если число отрицательное, и без завершающих нулей после десятичной точки. Значение 0
представляется без знака.
Примеры:
TEMP>w -"123"
-123
TEMP>w -"--123"
-123
TEMP>w -"-++-+-123"
123
TEMP>w -"123.23e1 ff"
-1232.3
TEMP>w -" 123.23e1 ff"
0
2.4 Вычитание (-)
Вычисляет арифметическую разность двух чисел.
Синтаксис
expr1 - expr2
Определение
44
ГЛАВА 2. ОПЕРАТОРЫ
expr1 и expr2 являются вычисляемыми значениями. Оператор вычитания приводит оба значения к числам, после чего вычитает из значения
expr1 значение expr2 и возвращает результат.
Если при вычислении возникает числовое переполнение, то оператор
вычитания генерирует ошибки <MAXNUMBER> или <MINNUMBER>.
Примеры:
TEMP>w 123-45
78
TEMP>w "12 a"-"8 b"
4
2.5
Умножение (*)
Вычисляет арифметическое произведение двух чисел.
Синтаксис
expr1 * expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор умножения приводит оба значения к числам, после чего возвращает результат
их арифметического произведения.
В случае если в результате произведения получается переполнение,
оператор произведения генерирует ошибки <MAXNUMBER> или <MINNUMBER>.
Примеры:
TEMP>w 12*45
540
TEMP>w "12 r"*"45 p"
540
TEMP>w ""*""
0
2.6
Деление (/)
Вычисляет результат деления значений операндов.
Синтаксис
2.7. ЦЕЛОЧИСЛЕННОЕ ДЕЛЕНИЕ (BACKSLASH)
45
expr1 / expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор деления
приводит оба значения к числам, после чего производит деление и возвращает результат. Если второй операнд expr2 равен нулю, то оператор
генерирует ошибку <DIVIDE>.
Результат деления, в зависимости от значений операндов, может быть
как целым числом, так и дробным. В случае если в результате деления
происходит переполнение, оператор генерирует ошибки <MAXNUMBER>
или <MINNUMBER>. Если в результате деления возвращаемое значение не может быть представлено, в силу своей величины, целым числом,
то результат приводится к дробному числу и производится потеря точности представления.
Примеры:
TEMP>w 123/45
2.73333333333333
TEMP>w 123/""
<DIVIDE>
TEMP>w 123/"12ff"
10.25
2.7 Целочисленное деление (backslash)
Вычисляет целую часть от деления.
Синтаксис
expr1 \ expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор целочисленного деления приводит оба значения к числам, после чего выполняет деление expr1 на expr2 и возвращает целую часть от результата
деления.
Примеры:
TEMP>w 12\8
1
46
ГЛАВА 2. ОПЕРАТОРЫ
TEMP>w 789\123
6
Оператор целочисленного деления часто используется для взятия целой части числа путем целочисленного деления на 1:
TEMP>s v=123.456 w v\1
123
2.8
Возведение в степень (**)
Вычисляет возведение значения операнда в степень, заданную другим
операндом.
Синтаксис
expr1 ** expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор возведения в степень приводит значения обоих операндов к числам и возводит значение, заданное операндом expr1, в степень, заданную операндом
expr2.
Если результат возведения в степень не может быть представлен
целым числом, производится его приведение к дробному с возможной
потерей точности. Если в результате возведения в степень получается переполнение, оператор генерирует ошибки <MAXNUMBER> или
<MINNUMBER>.
MiniM производит возведение и в дробные и в отрицательные значения степени.
Если значение expr1 является отрицательным числом, то оператор
возведения в степень генерирует ошибку <ILLEGAL VALUE>.
Примеры:
TEMP>w 12**-1
.0833333333333333
TEMP>w 12**-3
.000578703703703704
TEMP>w 12**-3.2
.000352062697854864
TEMP>w 4**.5
2.9. ДЕЛЕНИЕ ПО МОДУЛЮ (#)
47
2
TEMP>w 2**2
4
TEMP>w 2**""
1
2.9 Деление по модулю (#)
Вычисляет деление по модулю или иными словами остаток от деления
на́цело.
Синтаксис
expr1 # expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор деления по модулю приводит оба значения к числам, после чего возвращает
остаток от деления на́цело значения expr1 на expr2.
Если значение expr2 является нулем, то оператор генерирует ошибку
<DIVIDE>.
Примеры:
TEMP>w 123#8
3
TEMP>w 123\8
15
TEMP>w 123#0
<DIVIDE>
TEMP>w 123#8
3
TEMP>w 123.456#8
3.456
2.10
Конкатенация (_)
Возвращает строку, образованную соединением строк - аргументов.
Синтаксис
48
ГЛАВА 2. ОПЕРАТОРЫ
expr1 _ expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор конкатенации рассматривает их как строки, или если это числа, то как строковые представления чисел. При приведении чисел к строке их представление может быть изменено по правилам каноничности. Оператор
создаёт новое значение, образованное соединением значений операндов,
и возвращает его. Длина результата в байтах есть сумма длин операндов
в байтах. В возвращаемом значении сначала следуют байты из операнда
expr1, затем из expr2.
Если результат не может быть получен по причине выхода за пределы ограничений MiniM (32 KByte) на одно значение, то оператор при
выполнении генерирует ошибку <MAXSTRING>. Поскольку любое значение в MiniM может быть представлено в виде строки последовательности байтов, то оператор конкатенации применим к любым значениям
операндов.
Примеры:
TEMP>w 123e2_"vv"
12300vv
TEMP>s a="b",b="c" w a_b
bc
2.11
Нет (’)
Вычисляет логическую операцию отрицания.
Синтаксис
’ expr
Определение
expr вычисляется как число, после чего сравнивается на равенство с
нулём. Если значение expr равно нулю, то оператор возвращает значение
1, иначе для любого другого значения expr возвращает значение 0.
Оператор отрицания часто используется для приведения чисел к нормированному булевскому значению (если expr равно нулю, то вернуть 0,
если не равно нулю, то вернуть 1), путём использования двух операторов
отрицания.
Примеры:
2.11. НЕТ (’)
49
TEMP>w ’""
1
TEMP>w ’"asd"
1
TEMP>w ’’"asd"
0
TEMP>w ’123
0
Оператор отрицания по стандарту языка M[UMPS] применим, кроме
как к значениям выражений, также к нескольким бинарным операторам и к кодам шаблонов. Таблица применимости оператора отрицания к
бинарным операторам и получаемый в результате оператор:
’=
’>
’<
’[
’]
’&
’&&
’!
’||
’?
Не равно.
Не больше (меньше или равно).
Не меньше (больше или равно).
Не содержит.
Не следует.
Не И.
Не И (вычисляя как короткое И).
Не ИЛИ.
Не ИЛИ (вычисляя как короткое
ИЛИ).
Не соответствует шаблону.
Примеры:
TEMP>w 123’>12
0
TEMP>w 123’=12
1
TEMP>w 123’<12
1
Применение оператора отрицания к иным бинарным операторам приводит к синтаксической ошибке.
По своему действию применение отрицания к бинарному оператору
X эквивалентно применению отрицания к результату оператора X:
a ’X b == ’( a X b)
50
ГЛАВА 2. ОПЕРАТОРЫ
Применение оператора отрицания к кодам шаблонов задаёт отрицание кода шаблона. Если код шаблона указывает группу символов, то
отрицание этого кода означает - "не эта группа символов". Например:
TEMP>w "MiniM"?1"M"1.’N
1
В этом примере шаблон задаёт правило: один символ M, после которого один или более символов не являются цифрами.
2.12 Равно (=)
Проверяет значения на равенство.
Синтаксис
expr1 = expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор проверки на равенство приводит оба операнда к строковому представлению и
сравнивает на совпадение строк. Если строки в точности равны, возвращает значение 1, иначе значение 0.
Если один или оба операнда заданы или вычисляются как числа, то
MiniM приводит их к строковому каноническому представлению, которое может отличаться от представления числа, заданного программистом.
Примеры:
TEMP>w 0123=123
1
TEMP>w "0123"="123"
0
TEMP>w +"0123"=+"123"
1
TEMP>w "123.0"=123.0
0
TEMP>w +"123.0"=123.0
1
2.13. БОЛЬШЕ (>)
2.13
51
Больше (>)
Сравнивает два значения как чи́сла.
Синтаксис
expr1 > expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор больше
приводит оба значения к числам, после чего сравнивает, который из
них больше по величине как число. Если значение expr1 больше, то
возвращает результат 1, иначе если меньше или равны, то возвращает
результат 0.
Примеры:
TEMP>w "a">"b"
0
TEMP>w "0123">"123"
0
TEMP>w "01230">"123"
1
2.14
Больше или равно (>=)
Сравнивает два значения как чи́сла.
Синтаксис
expr1 >= expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор больше
или равно приводит оба значения к числам, после чего сравнивает, который из них больше или равно по величине как чи́сла. Если значение
expr1 больше или равно, то возвращает результат 1, иначе если меньше,
то возвращает результат 0.
Оператор больше или равно не входит в стандарт языка M[UMRS].
Поэтому при написании переносимых программ его нужно заменять на
оператор не меньше. Оператор больше или равно поддерживается системой MiniM как более легкий для чтения и понимания.
52
ГЛАВА 2. ОПЕРАТОРЫ
MiniM не поддерживает отрицательную форму этого оператора как
не больше или равно, генерируя для такой конструкции ошибку <SYNTAX>.
Для такой конструкции следует использовать оператор меньше.
Примеры:
TEMP>w "a">="b"
1
TEMP>w "0123">="123"
1
TEMP>w "01230">="123"
1
2.15
Меньше (<)
Сравнивает два значения как чи́сла.
Синтаксис
expr1 < expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор меньше
приводит оба значения к числам, после чего сравнивает, которое из них
больше по величине как число. Если значение expr1 меньше, то возвращает результат 1, иначе если больше или равны, то возвращает результат
0.
Примеры:
TEMP>w "a"<"b"
0
TEMP>w "0123"<"123"
0
TEMP>w "01230">"123"
0
TEMP>w "01230"<"12300"
1
2.16
Меньше или равно (<=)
Сравнивает два значения как чи́сла.
2.17. ПРОВЕРКА НА ВХОЖДЕНИЕ ([)
53
Синтаксис
expr1 <= expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор меньше или равно приводит оба значения к числам, после чего сравнивает,
которое из них больше по величине как число. Если значение expr1
меньше или равно expr2, то возвращает результат 1, иначе если больше,
то возвращает результат 0.
Оператор меньше или равно не входит в стандарт языка M[UMPS].
Поэтому при написании переносимых программ его нужно заменять на
оператор не больше. Оператор больше или равно поддерживается системой MiniM как более легкий для чтения и понимания.
MiniM не поддерживает отрицательную форму этого оператора как
не меньше или равно, генерируя для такой конструкции ошибку <SYNTAX>.
Для такой конструкции следует использовать оператор больше.
Примеры:
TEMP>w "a"<="b"
1
TEMP>w "012"<="013"
1
TEMP>w 123<=45
0
2.17
Проверка на вхождение ([)
Проверяет вхождение одной строки в другую.
Синтаксис
expr1 [ expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор проверки вхождения рассматривает их как строки и производит поиск подстроки expr2 в строке expr1. Если строка expr2 полностью содержится в
строке expr1? хотя бы один раз, оператор возвращает значение 1, иначе
возвращает 0.
54
ГЛАВА 2. ОПЕРАТОРЫ
Особым случаем является пустая строка в операнде expr2. В этом
случае, независимо от значения expr1, возвращается значение 1, поскольку по стандарту M[UMPS] пустая строка содержится в любой строке.
Поиск выполняется чувствительно к регистру символов, прописные
и строчные буквы считаются различными.
Примеры:
TEMP>w 123[12
1
TEMP>w "MiniM"["N"
0
TEMP>w 123456[""
1
2.18
Следует (])
Определяет порядок следования строк в бинарном сравнении.
Синтаксис
expr1 ] expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор следования приводит оба значения к строковым представлениям и выполняет
сравнение строк как последовательность байт. Возвращает 1, если значение expr1 бинарно сортируется после значения expr2. Иначе, если exp2
сортируется после expr1 или если строки в точности совпадают, возвращает 0.
При сравнении байт учитывается их старшинство по значению.
Примеры:
TEMP>w 123]""
1
TEMP>w 123]123
0
TEMP>w ""]123
0
TEMP>w "minim"]"mini"
1
TEMP>w 1]0
1
2.19. СЛЕДУЕТ ИЛИ РАВНО (]=)
2.19
55
Следует или равно (]=)
Оператор проверяет оба операнда, следуют ли они в сортировке ASCII
или совпадают в строковом представлении.
Синтаксис
expr1 ]= expr2
Определение
Оператор приводит значения обоих операндов к строковому представлению и проверяет следует ли левый операнд после правого в ASCII сортировке или они совпадают по значению. Если это условие выполняется
то оператор возвращает значение 1, иначе значение 0. Для сравнения
оператор использует именно ASCII сравнение, независимо от установленного Character Collation и поэтому сравнение отличается от индексной сортировки.
2.20
Сортируется после (]])
Сравнивает значения операндов в индексной сортирующей последовательности.
Синтаксис
expr1 ]] expr2
Определение
Оператор сортируется после вычисляет значения выражений expr1
и expr2. После чего, в случае если значения являются каноническими
представлениями чисел, то считает их числами, иначе строками. Оператор возвращает 1, если значение expr1 следует за значением expr2 в
индексной сортировке.
В индексной сортировке самым младшим значением является пустая
строка. За ней следуют числа в порядке их возрастания. За числами
следуют строки в порядке определения следования символов в файле
Locale (файл minim.ini, секция Server, ключ Locale).
То же самое правило определения следования, что и у оператора
сортируется после, используется в MiniM при определении очерёдности
следования в дереве локальных, глобальных и системных структурных
переменных.
56
ГЛАВА 2. ОПЕРАТОРЫ
2.21
Сортируется после или равно (]]=)
Сравнивает два операнда в индексной сортировке, сортируются ли один
после другого или равны.
Синтаксис
expr1 ]]= expr2
Определение
Оператор Сортируется после или равно Проверяет что левый операнд сортируется после правого или равен в текущей используемой
индексной сортировке. Перед сравнением оба операнда вычисляются и
сравниваются при необходимости как числа или как строки, в соответствии с правилом индексной сортировки. Оператор возвращает 1 если
левый операнд сортируется после правого или они равны.
2.22
И (&)
Вычисляет логическую операцию И над операндами.
Синтаксис
expr1 & expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор И приводит оба значения к числам, после чего сравнивает каждый из операндов с нулем и получает значения аргументов в булевой форме. Если
операнд после приведения к числу равен 0, то используется как 0, иначе
используется как 1. Оператор И возвращает значение по таблице истинности:
expr1
0
0
1
1
Примеры:
TEMP>w 123&456
expr2
0
1
0
1
И
0
0
0
1
2.23. КОРОТКИЙ И (&&)
57
1
TEMP>w "a"&"b"
0
2.23 Короткий И (&&)
Вычисляет логическую операцию И над операндами.
Синтаксис
expr1 && expr2
Определение
Оператор короткий И вычисляет сначала первое выражение expr1.
Если это выражение равно 0, то оператор не вычисляет второе выражение expr2 и сразу возвращает значение 0. Иначе, если expr1 не равно 0,
то производит вычисление expr2, приводит его к нормированному булевскому значению 1 - 0 и возвращает это значение.
Оператор короткий И не входит в стандарт языка M[UMPS] и для написания переносимых программ его не следует использовать. Оператор
поддерживается для оптимизации выполнения программ и, поскольку
может не иметь косвенного эффекта из-за необязательности вычисления второго аргумента, программистам следует быть внимательными в
случае его применения.
Примеры:
TEMP>k
TEMP>w 0&&$i(a),! w
0
TEMP>w 1&&$i(a),! w
1
a=1
Здесь в первом случае оператор короткий И не вызвал косвенного
эффекта, а во втором - вызвал, поскольку в первом случае вычисления
второй части не потребовалось.
К оператору короткий И может быть применён оператор отрицания,
который сохраняет короткое поведение оператора при вычислении значения.
Оператор a’&&b эквивалентен ’a&&b.
58
ГЛАВА 2. ОПЕРАТОРЫ
2.24
ИЛИ (!)
Вычисляет логическую операцию ИЛИ над операндами.
Синтаксис
expr1 ! expr2
Определение
expr1 и expr2 являются вычисляемыми значениями. Оператор ИЛИ
приводит оба значения к числам, после чего сравнивает каждый из операндов с нулем и получает значения аргументов в булевой форме. Если
операнд после приведения к числу равен 0, то используется как 0, иначе используется как 1. Оператор ИЛИ возвращает значение по таблице
истинности:
expr1
0
0
1
1
expr2
0
1
0
1
ИЛИ
0
1
1
1
Примеры:
TEMP>w 1!"a"
1
TEMP>w " "!"a"
0
2.25
Короткий ИЛИ (||)
Вычисляет логическую операцию ИЛИ над операндами.
Синтаксис
expr1 || expr2
Определение
Оператор короткий ИЛИ вычисляет сначала первое выражение expr1.
Если это выражение не равно 0, то оператор не вычисляет второе выражение expr2 и сразу возвращает значение 1. Иначе, если expr1 равно 0,
то производит вычисление expr2, приводит его к нормированному булевскому значению 1 - 0 и возвращает это значение.
2.26. XOR (!!)
59
Оператор короткий ИЛИ не входит в стандарт языка M[UMPS] и для
написания переносимых программ его не следует использовать. Оператор поддерживается для оптимизации выполнения программ и, поскольку может не иметь косвенного эффекта из-за необязательности вычисления второго аргумента, программистам следует быть внимательными
в случае его применения.
Примеры:
TEMP>w 1||$i(a),! w
1
TEMP>w 0||$i(a),! w
1
a=1
К оператору короткий ИЛИ может быть применён оператор отрицания, который сохраняет короткое поведение оператора при вычислении
значения.
Оператор a’||b эквивалентен ’a||b.
2.26
XOR (!!)
Оператор вычисляет логическую функцию ИСКЛЮЧАЮЩЕЕ ИЛИ для
двух операндов.
Синтаксис
expr1 !! expr2
Определение
Оператор вычисляет оба операнда в порядке слева направо и оба
приводит к значению истинности, сравнивая с нулем, и для полученны
результатов вычисляет операцию ИСКЛЮЧАЮЩЕЕ ИЛИ, задаваемую
следующей таблицей:
expr1
0
0
1
1
expr2
0
1
0
1
XOR
0
1
1
0
60
ГЛАВА 2. ОПЕРАТОРЫ
Операция дает результат 1 если операнды имеют различные значения
истинности и 0 если одинаковые.
Примеры:
TEMP>w 123!!456
0
TEMP>w "a"!!"b"
0
TEMP>w 0!!6
1
2.27
Проверка по шаблону (?)
Проверяет соответствие строки заданному шаблону.
Синтаксис
expr1 ? expr2
Определение
expr1
expr2
Вычисляемое на этапе выполнения
выражение, строку которого требуется проверять на соответствие шаблону.
Выражение, задающее шаблон проверки. Определяется на этапе синтаксического анализа.
Выражение expr2, как шаблон проверки, может быть вычисляемым
на этапе выполнения, если использовать косвенную форму задания шаблона:
expr1 ? @expr2
В этом случае MiniM использует в качестве шаблона содержание
получаемого при вычислении значения expr2.
Шаблон проверки состоит из последовательности, включающей следующие подряд друг за другом атомарные шаблоны. Один атомарный
шаблон состоит из задания количества повторений, за которым следует
либо код шаблона, либо последовательность символов, либо альтернирование:
pattern = repcount patcode
2.27. ПРОВЕРКА ПО ШАБЛОНУ (?)
61
pattern = repcount string
pattern = repcount alternation
Количество повторов конструируется из цифр с указанием или неуказанием точки. Количество повторов применяется к следующему сразу за
ним атомарному шаблону и означает требование, чтобы в строке в этой
очерёдности встретилась такая группа символов. Формы задания количества повторов:
count
.
min .
. max
min . max
Точно указанное воличество.
Любое количество, включая ноль повторов.
Минимум min раз, максимум не
ограничен.
Максимум max раз, начиная с нуля.
От min до max раз включительно.
Задание кода шаблона производится указанием символа, соответствующего классу символов:
A
C
E
L
N
P
U
Буквы.
Непечатные символы. Символы с кодами от 0 до 31 и с кодом 127.
Любой символ.
Буква в нижнем регистре.
Цифра.
Знаки пунктуации и пробел.
Буква в верхнем регистре.
Коды классов символов могут задаваться как в верхнем, так и в
нижнем регистре.
MiniM при определении, какой символ является буквой, руководствуется текущей таблицей символов, указанной в файле настроек minim.ini,
секция [Server], ключ Locale. Этот ключ задаёт имя файла с определением символов, размещаемое в подкаталоге nat. В этом файле задаются
правила поднятия и опускания регистра. Буквой считается символ, для
которого различаются значения в верхнем и нижнем регистре.
Коды классов символов могут следовать один за другим, что задаёт
объединение классов символов, например последовательность UN определяет класс "верхний регистр и цифры". Например:
TEMP>w "MiniM"?1UN.E
1
62
ГЛАВА 2. ОПЕРАТОРЫ
К классу символов может применяться операция отрицания, означающая "не из этого класса". Например:
TEMP>w "MiniM"?1’N.E
1
TEMP>w "MiniM"?1’NP.E
1
Первый шаблон задаёт строку, которая начинается не с цифры, второй - не с цифры и не с символа пунктуации соответственно, после
которых следует любая последовательность символов.
Задание последовательности символов производится строкой, следующей за patcount, без пробелов и заключенной в двойные кавычки. Например:
TEMP>w "MiniM"?1"M".E
1
Этот шаблон задаёт правило: сначала одна строка "M", после чего
любое количество любых символов. Например:
TEMP>w "MiniM"?1"Mini".E
1
TEMP>w "MiniM"?1"Minim".E
0
Эти шаблоны задают строки, начинающиеся с подстрок "Mini" и
"Minim", соответственно.
Задание альтернирования производится круглыми скобками с разделением альтернатив запятыми:
alternation = ( pattern [ , pattern ...])
Например:
TEMP>w "MiniM"?1(1"Min",1"Max").E
1
TEMP>w "MiniM"?1(1"mos",1"ber").E
0
Альтернированные шаблоны могут использоваться вложено один в
другой.
С помощью альтернирования и строк можно организовать свои напрямую перечисляемые классы символов, например проверка, содержит
ли строка только восьмеричные символы:
2.28. 16-ОЕ ЧИСЛО (#)
63
TEMP>w "MiniM"?.(1"0",1"1",1"2",1"3",1"4",1"5",1"6",1"7")
0
TEMP>w "0177"?.(1"0",1"1",1"2",1"3",1"4",1"5",1"6",1"7")
1
И с помощью косвенности использовать этот шаблон более кратким
образом:
TEMP>s patoct=".(1""0"",1""1"",1""2"",1""3"",
1""4"",1""5"",1""6"",1""7"")"
TEMP>w "MiniM"?@patoct
0
TEMP>w "0177"?@patoct
1
2.28
16-ое число (#)
Возвращает число из аргумента, заданного шестнадцатеричными числами.
Синтаксис
# symbols
Определение
Оператор задания числа в шестнадцатеричной форме вычисляется на
этапе синтаксического анализа и не может быть применим к выражению
на этапе выполнения. После символа этого оператора следует последовательность шестнадцатеричных чисел (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A,
b, B, c, C, d, D, e, E, f, F). Шестнадцатеричные числа задают значение
числа, которое возвращается этим псевдооператором.
Младший разряд задаётся крайним правым шестнадцатеричным символом, левый символ задаёт самый старший разряд. Если количество
символов нечётное, то синтаксический анализатор считает, что пропущен первый ноль.
При использовании оператора шестнадцатеричного представления нужно учитывать, что символ # является также спецификатором формата команды write. При необходимости использовать шестнадцатеричное
представление чисел в команде write нужно взять выражение в круглые
скобки.
Примеры:
64
ГЛАВА 2. ОПЕРАТОРЫ
TEMP>s a=#41
TEMP>w
a=65
TEMP>w $a(#41)
54
TEMP>w $c(#41)
A
TEMP>w $c(#41,#42,#43)
ABC
TEMP>s a=#123,b=#ff
TEMP>w
a=291
b=255
TEMP>w (#cafe)
51966
TEMP>w (#CAFE)
51966
TEMP>w (#AAA)
2730
TEMP>w (#0AAA)
2730
TEMP>w *#41
A
В последнем примере (w *#41) было задание вывести символ с кодом
#41, это код символа A.
Глава 3
Команды
3.1
CLOSE
Закрывает и освобождает устройство ввода-вывода.
Синтаксис
C[LOSE][:pc]
C[LOSE][:pc] closearg[,closearg2,...]
C[LOSE][:pc] dev[:param]
C[LOSE][:pc] dev[:(param,...)]
C[LOSE][:pc] @indclosearg
Определение
pc
dev
params
closearg
indclosearg
Постусловное выражение.
Строка идентификации устройства ввода-вывода.
Параметры команды.
Аргументы команды в виде dev[:params].
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда close, применительно к устройству ввода-вывода по умол65
66
ГЛАВА 3. КОМАНДЫ
чанию (основному устройству) игнорируется и не выполняет никаких
действий и не генерирует никаких ошибок. Команда close выполняет
закрытие только устройств, открытых командой open. Команда close не
может закрыть устройства, открытые другими процессами.
При своём выполнении команда close вызывает действия по закрытию
устройства, освобождению занимаемых им ресурсов и удаляет устройство из списка открытых. После чего делает текущим основное устройство.
Команда close без аргументов выполняет закрытие всех открытых
процессом устройств ввода-вывода, после чего делает текущим основное
устройство.
Если устройство, задаваемое строкой идентификации dev, не было
открыто, то команда ничего не делает.
Параметры команды close задаются или позиционно или именованно. Если параметр только один, то он может указываться без круглых
скобок, иначе указание параметров в круглых скобках обязательно. Например:
s dev="|FILE|c:\temp\1234.tmp"
close dev:/DELETE
close dev:(/DELETE)
close dev:(/TRUNCATE:/RENAME="L:\1234.log")
; 1
; 2
; 3
Здесь в первом случае используется только один параметр, он может
быть указан без круглых скобок. Во втором случае один параметр указан в круглых скобках, в третьем случае использованы два параметра,
указаные в круглых скобках.
Имена параметров команды close нечувствительны к регистру. Например:
close "|FILE|c:\temp\1234.tmp":(/DELETE)
close "|FILE|c:\temp\1234.tmp":(/Delete)
close "|FILE|c:\temp\1234.tmp":(/delete)
Здесь параметр /DELETE указан в различных регистрах, но распознаётся одинаково во всех формах.
При задании аргументов косвенно выражение indclosearg вычисляется как строка, и к результату применяется команда close. Например:
s fname="c:\tmp\123.tmp"
s opt="(/DELETE)"
3.2. DO
67
...
s indclosearg="""|FILE|"_fname_""":"_opt
close @indclosearg
Значением indclosearg не может быть пустая строка.
3.2
DO
Вызывает подпрограмму.
Синтаксис
D[O][:pc] entryref[:pc1][,entryref[:pc2]]
D[O][:pc] entryref([param[,param2...]])[:pc1][,entryref([param[,param2...]])[:pc2]]
D[O][:pc] @doarg
D[O][:pc]
Определение
pc
entryref
doarg
param
Постусловное выражение.
Ссылка вызова подпрограммы.
Косвенное выражение с аргументами команды.
Фактический аргумент (пропуск, передача значения
или имени локальной переменной после точки).
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Точки входа entryref могут быть представлены как:
LabelName[+Offset][^RoutineName]
^RoutineName
Здесь
LabelName
Offset
RoutineName
Имя метки в рутине.
Смещение.
Имя рутины.
68
ГЛАВА 3. КОМАНДЫ
Имя рутины может быть задано с явным указанием базы данных
рутины и без указания. Если имя базы данных рутины не указано явно,
то берутся рутины с указанным именем в текущей базе данных.
Смещение Offset вычисляется как выражение, приводится к целому
числу и должно быть положительно.
Все порции входной ссылки могут быть представлены косвенно, используя выражения косвенности:
@LabelNameExpr[+Offset][^@RoutineNameExpr]
^@RoutineNameExpr
Постусловные выражения при входных ссылках вычисляются, если
указаны как целые числа. Если постусловное выражение при входной
ссылке не указано, то вызов выполняется. Если указано и вычисляется
как значение, равное нулю, то вызов подпрограммы не выполняется,
иначе выполняется.
Обработка аргументов, перечисленных через запятую, выполняется
слева направо.
В контексте вызываемой подпрограммы создаётся новый уровень стека и переменная-индикатор возврата $quit принимает значение 0.
При вызове метки без параметров параметры не следует передавать.
При вызове метки с параметрами требуется передавать параметры.
Число передаваемых параметров может не совпадать с числом принимаемых, здесь действует общее правило передачи параметров, описанное
в документации в теме передачи параметров.
При использовании косвенной формы команды do выражение doarg
вычисляется как строка и к ней применяется команда do. Значением
строки doarg должно быть синтаксически корректное перечисление входных ссылок.
Безаргументная форма команды do выполняет, в случае если выполняется постусловное выражение pc, блочную подпрограмму. Блочная
подпрограмма должна следовать сразу за строкой с командой. Строки
образуют блочную подпрограмму, если в их начале имеется последовательность одной или нескольких точек.
Количество точек указывает уровень блока. Команда do выполняет
следующие за ней строки, если эти строки имеют на одну точку больше, чем строка, в которой расположена команда do. Если такие строки
окончены, то выполняется неявная команда quit, выполнение блочной
подпрограммы заканчивается и управление возвращается на следующую
за командой do команду. Например:
3.3. ELSE
69
label(param)
new i
for i=1:1:param do
. write "i = ",i,!
. f j=1:1:3 d
. . w "j = ",j,!
quit
Если при выполнении блочной подпрограммы встречается команда
quit без аргументов, то она прекращает выполнение блочной подпрограммы и управление возвращается на команду, следующую за командой do.
Если при выполнении блочной подпрограммы встречается команда
quit с аргументами, то она генерирует ошибку <COMMAND> как недопустимую.
В строке команда, не принадлежащей программе, команда do без
аргументов приводит к генерации ошибки синтаксиса <SYNTAX>, поскольку находится не в теле программы.
При выполнении безаргументной формы команды do значение системной переменной $test защищается от изменений на предыдущем уровне
стека, а при выполнении команды do с аргументом не защищается. См.
описание системной переменной $test.
В косвенной форме допускается ослабленная трактовка аргумента,
используются лишь первые синтаксические последовательности, соответствующие меткам. Если после меток следуют пробельные или иные
символы, то они игнорируются.
3.3 ELSE
Выполняет группу команд, если значение переменной $test равно 0.
Синтаксис
E[LSE]
Определение
У команды else нет формы с постусловным выражением.
Команда else сравнивает значение переменной $test с нулем. Если
значение равно 0, то выполняются следующие в этой строке команды.
Выполнение команды else не изменяет значение переменной $test.
Значение переменной $test изменяется командой if, командами lock,
read, open, job с указанием тайм-аутов.
70
3.4
ГЛАВА 3. КОМАНДЫ
FOR
Вызывает выполнение следующих за ней команд столько раз, сколько
определено аргументами команды for.
Синтаксис
F[OR]
F[OR] lvn=forparams[,lvn2=forparams2,...]
Определение
lvn
forparams
Локальная переменная, переменная цикла.
Перечень параметров, условия выполнения цикла.
Команда for не имеет постусловий и косвенного задания аргумента.
Безаргументная форма команды for выполняет последующие за ней
команды до тех пор, пока выполнение цикла не будет прервано командой quit в безаргументной форме, командой goto, или процесс не будет
уничтожен. Прерывание выполнения цикла командой quit с аргументом
приводит к генерации ошибки <COMMAND>. Команда quit и команда
goto прерывают выполнение последнего из выполняющихся циклов for,
если в строке несколько циклов.
Параметры цикла forparams являются перечислением через запятую
отдельных параметров цикла:
forparams = forparam[,forparam...],
где каждый из параметров forparam может иметь одну из следующих
форм:
expr
start:step
start:step:end
Одно значение.
Начало и приращение.
Начало, приращение и конец.
Каждое из выражений expr, start, step, end вычисляется однократно
до выполнения первой команды после команды for и в дальнейшем изменение переменных, входящих в эти выражения, не оказывает влияния
на выполнение цикла.
При выполнении команды for с переменной цикла команда поочерёдно определяет форму параметра, которую должна принять переменная
цикла. Затем, в зависимости от формы параметра, выполняется цикл с
3.4. FOR
71
этой переменной.
Если указано несколько forparam через запятую, то все они поочерёдно слева направо применяются к одной и той же переменной цикла.
Через запятую переменной цикла можно указывать последовательное
прохождение по нескольким условиям, в том числе различной формы.
Одно значение
При задании одного значения команда for присваивает переменной
цикла указанное значение и передает управление на команды, следующие за ней. Пример:
TEMP>f i=1 w
i=1
С помощью перечисления через запятую определённых значений можно указать команде for, что переменная цикла должна принять последовательно указанные значения. Пример:
TEMP>f i="red","green","blue" w i,!
red
green
blue
Начало и приращение
При задании начального значения start и значения приращения step
их вычисление происходит перед выполнением первой итерации. Их значения, впоследствии, используются вне зависимости от изменения величин, которые на них влияют.
Команда for выполняет первую итерацию с переменной цикла, равной
значению start. Последующие итерации выполняются прибавлением к
текущей величине переменной цикла величины step. Например:
TEMP>f i=1:1 w i,! q:i>=12
1
2
3
4
5
6
7
8
72
ГЛАВА 3. КОМАНДЫ
9
10
11
12
TEMP>
Значение переменной цикла, как и любой другой локальной переменной, может быть изменено программно. В случае если при выполнении
итерации команда for определила, что переменная цикла имеет неопределённое значение, то команда генерирует ошибку <UNDEFINED>. Например:
TEMP>f i=1:1 w i,! k:i=5 i q:i>=12
1
2
3
4
5
<UNDEFINED>
TEMP>
TEMP>f i=1:1 w i,! s i=i+$random(5) q:i>=12
1
2
5
6
8
11
12
Направление цикла, увеличение или уменьшение определяется знаком значения вычисляемого выражения step.
Начало, приращение и конец
Трактовка третьей формы команды for делится на две части, если
шаг приращения step неотрицательный, и если отрицательный.
Если шаг приращения step неотрицательный, то значения start, step и
end вычисляются как числа. Далее они используются неизменно. Переменной цикла присваивается значение start. Если значение переменной
3.4. FOR
73
цикла больше, чем end (сравниваются как числа), то цикл считается
выполненным. Иначе выполняются команды после команды for.
После выполнения цикла значение переменной цикла снова сравнивается со значением end. И если оно больше, то цикл выполнен. Иначе к
значению переменной цикла прибавляется значение step. Результат снова
сравнивается со значением end, и если оно больше, то цикл заканчивает выполнение, иначе выполняются команды после команды for. И эта
последовательность снова повторяется. Примеры:
TEMP>f i=1:2:8 w i,!
1
3
5
7
TEMP>
Если шаг приращения step отрицательный, то значения start, step и
end вычисляются как числа. Далее они используются неизменно. Переменной цикла присваивается значение start. Если значение переменной
цикла меньше, чем end, то цикл закончен. Иначе выполняются команды
после команды for.
После выполнения цикла значение переменной цикла снова сравнивается со значением end, и если оно меньше, то выполнение цикла прекращается. Иначе к переменной цикла прибавляется значение step (отрицательное). И результат снова сравнивается со значением end. Если
меньше, то цикл прекращается, иначе выполняются команды после команды for. И эта последовательность снова повторяется. Примеры:
TEMP>f i=3:-2:-6 w i,!
3
1
-1
-3
-5
TEMP>
Таким образом, сравнение на больше-меньше переменной цикла со
значением окончания end определяется знаком значения step, и при выполнении тела цикла программист может самостоятельно изменить значение переменной цикла так, чтобы выйти из него. Примеры:
74
ГЛАВА 3. КОМАНДЫ
TEMP>f i=1:1:5 w i,! i i=3 s i=10
1
2
3
TEMP>
3.5
GOTO
Передаёт управление на указанную строку.
Синтаксис
G[OTO][:pc] labelref1[:pc1][,labelref2[:pc2],...]
G[OTO][:pc] @gotoarg
Определение
pc
labelref
@gotoarg
Постусловное выражение.
Имя метки, смещение, рутина.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Постусловные выражения при метках вычисляются для проверки необходимости выполнить переход. Если постусловия при метке нет, то переход выполняется, иначе вычисляется как число и сравнивается с нулём,
если результат не равен нулю, то переход выполняется.
Команда goto выполняет переход только по одной из меток, по первой
слева направо, для которой либо отсутствует постусловие при метке,
либо оно вычисляется в числовое значение, отличное от нуля. Остальные
метки игнорируются.
Метка может содержать имя метки, смещение и имя рутины. Если
имя рутины опущено, то считается, что требуется переход в текущую
рутину. Если метка опущена, то переход выполняется по смещению относительно первой строки. Если смещение опущено, то переход выпол-
3.6. HALT
75
няется на строку с меткой. Если не указаны ни метка, ни смещение, то
выполняется переход на первую строку рутины.
Смещение должно задаваться (если задаётся) строго как вычисляемое значение (включительно константы) и не должно принимать отрицательных значений.
Команда goto не передаёт фактических параметров при переходе в
метку.
При переходе на строку блочного do выполняется пропуск строк до
тех пор, пока не встретится строка с тем же (или меньшим) количеством
точек, что и строка, откуда выполняется переход.
При переходе в несуществующую рутину, при отсутствии текущей
рутины или при отсутствии указанной метки, команда генерирует ошибки об их отсутствии соответственно.
При косвенной форме команды в значении gotoarg должны быть синтаксически корректные задания места для передачи управления. При
косвенной форме сначала вычисляется выражение gotoarg, затем полученное значение рассматривается как перечисление целей перехода.
В косвенной форме допускается ослабленная трактовка аргумента,
используются лишь первые синтаксические последовательности, соответствующие меткам. Если после меток следуют пробельные или иные
символы, то они игнорируются.
3.6 HALT
Завершает работу процесса.
Синтаксис
H[ALT][:pc]
Определение
pc
Постусловное выражение.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке.
Команда halt, в зависимости от настроек сервера, выполняет откат,
подтверждение незавершённых явно транзакций или оставляет их незакрытыми, закрывает все открытые процессом устройства и открытое автоматически устройство ввода-вывода по умолчанию, снимает все бло-
76
ГЛАВА 3. КОМАНДЫ
кировки, установленные процессом на локальные и глобальные переменные, освобождает ресурсы подгруженных разделяемых библиотек и
завершает процесс. Примеры:
h
h:a=1
h:a
; 1
; 2
; 3
Здесь в первом случае производится безусловный выход процесса, во
втором случае процесс завершается, если значение переменной a равно
1, в третьем случае процесс завершается, если переменная a не равна 0.
MiniMono difference
В MiniM Embedded Edition команда halt завершает текущий вызов
хост процесса, но не завершает процесс. После того как очередное обращение к MiniMono завершено командой halt, хост процесс может продолжать выполнять другие обращения к MiniMono. Хост процесс завершает
свою работу только самостоятельно.
3.7
HANG
Приостанавливает выполнение программы на указанное время.
Синтаксис
H[ANG][:pc] time[,time2,...]
H[ANG][:pc] @hangarg
Определение
pc
time
hangarg
Постусловное выражение.
Выражение, задающее количество секунд для приостанова.
Выражение, косвенно задающее аргумент hang.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
3.8. IF
77
Команда hang вычисляет значение аргумента как число. Полученное значение используется как число секунд, и выполняется задержка
выполнения программы с округлением тайм-аута до целого числа миллисекунд. Например:
hang 2
set t=2
hang t
; 1
; 2
Здесь в первом случае тайм-аут задаётся константным выражением,
во втором случае - значением переменной.
При задании аргументов команды косвенно выражение hangarg вычисляется как строка и к ней применяется команда hang. Например:
h @("3,3")
Здесь последовательно выполняются две задержки по 3 секунды.
3.8
IF
Выполняет последующую в строке группу команд, если верно условие.
Синтаксис
I[F]
I[F] expr[,expr2,...]
I[F] @ifarg
Определение
expr
ifarg
Выражение, значение которого сравнивается с 0.
Косвенное выражение с аргументами команды.
У команды if нет постусловного выражения.
Безаргументная форма команды if проверяет значение переменной
$test. Значение сравнивается с нулём, и если не равно нулю, то выполняются команды в строке после команды if. Иначе выполнение последующих команд строки заканчивается.
Команда if с аргументом вычисляет выражение как число и сравнивает с нулём. Если значение не равно 0, то выполняются команды в
строке после команды if. Иначе выполнение последующих команд строки
78
ГЛАВА 3. КОМАНДЫ
заканчивается.
Косвенное задание аргументов приводит к вычислению выражения
как строки и применению к ней команды if.
Если у команды if несколько аргументов один за другим, то команда
вычисляет выражения слева направо. Если выражение не равно 0, то
команда переходит к следующему аргументу, иначе выполнение последующих команд строки прекращается.
Примеры:
Проверить значение переменной $test и выполнить действие в зависимости от его значения:
TEMP>w $t
0
TEMP>i w 1
TEMP>
Вычислить выражения и выполнить действия в зависимости от результата:
TEMP>i 1,2 w 123
123
TEMP>s a=0
TEMP>i a w 456
TEMP>
Выполнить проверку условия косвенно:
TEMP>s ifexpr="1,2"
TEMP>i @ifexpr w 123
123
TEMP>s ifexpr="1,0"
TEMP>i @ifexpr w 123
TEMP>
3.9. JOB
79
В качестве вычисляемого выражения могут быть использованы выражения произвольной сложности.
При выполнении команды if значение переменной $test изменяется в
значение 0, если выражение равно 0, и в значение 1, если выражение
не равно 0. Значение $test, впоследствии, может быть использовано в
сочетании как с безаргументной формой команды if, так и с командой
else.
3.9 JOB
Запускает новый процесс.
Синтаксис
J[OB][:pc] jobargument,...
jobargument = labelˆ|database|routine(params):(process-params):timeout
process-params = process-param[:process-params...]
J[OB][:pc] @jobarg
Определение
pc
jobargument
label
database
routine
params
process-params
timeout
Постусловное выражение.
Спецификация вызова процесса, с чего ему начать
выполнение.
Метка в указанной рутине, с которой выполнять процесс.
База данных, в которой находится рутина запускаемого процесса.
Имя рутины запускаемого процесса.
Передаваемые фактические параметры.
Параметры запуска процесса, его окружение.
Время ожидания успешности запуска процесса, секунды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
80
ГЛАВА 3. КОМАНДЫ
одному из них.
Для спецификации запуска процесса нельзя передавать параметры по
ссылке, указывая перед именем локальной переменной точку. В остальном передача параметров полностью соответствует передаче параметров
подпрограмме. Синтаксически такая конструкция допустима, но при попытке её выполнения генерируется ошибка <JOB>.
Нельзя одновременно указывать смещение относительно метки и передаваемые фактические параметры.
Команда job запускает параллельный процесс MiniM, который начинает выполнение с указанной метки указанной рутины. Процессу в качестве значений аргументов передаются перечисленные значения params.
Новый процесс получает значение системной переменной $zparent, равное значению $job текущего процесса, выполнившего команду job. После
выполнения команды job процесс получает номер запущенного процесса
в системной переменной $zchild. Значение системной переменной $zchild
сохраняется, в том числе, и после завершения дочернего процесса и может быть изменено запуском нового процесса.
Запущенный процесс существует в параллельном адресном пространстве и имеет собственную копию своих локальных переменных. Процессы MiniM выполняется параллельно.
Новый процесс по умолчанию имеет текущее устройство типа NULL.
При указании значения тайм-аута (времени ожидания запуска процесса) и при успешном запуске процесса значение системной переменной
$test принимает значение 1, иначе 0. Если значение тайм-аута не указано, то значение системной переменной $test не изменяется.
Новому процессу в параметрах процесса (process-params) можно указать позиционно дополнительные характеристики его окружения. Значения параметров процесса разделяются двоеточием.
Первый параметр рассматривается как строка с именем базы данных, которая должна стать текущей для нового процесса. При старте он
автоматчиески переключается в указанную базу данных. Если указывается только первый параметр, то заключать параметр процесса в круглые
скобки необязательно.
Второй параметр рассматривается как строка идентификации устройства ввода-вывода типа TCP. Для этого устройства должна быть выполнена операция /ACCEPT. Дочернему процессу передаётся этот сокет
для конкурентного использования, и для него автоматически заводится
устройство ввода-вывода по умолчанию типа TCP. Устройству даются
разрешения чтения и записи и оно переводится в бинарный режим работы. Изменить режим работы может дочерний процесс, вызвав соответствующие команды use, применительно к своему устройству по умолча-
3.10. KILL
81
нию.
Третий параметр рассматривается как строка, перечисляющая через
запятые имена локальных переменных. Для этих локальных переменных
создаётся копия в дочернем процессе. После запуска их значения существуют независимо от родительского процесса. Копия этих локальных
переменных создаётся полностью, включая индексированные значения и
с теми же именами.
Любой из параметров процесса может быть опущен, но разделение
позиций двоеточиями должно быть сохранено. Перед последним пропущенным параметром двоеточие необязательно. Все параметры процесса
могут быть указаны и как константные строки, и как вычисляемые значения. Вычисление значений параметров процесса производится слева
направо.
Дочерний процесс выполняется в контексте "DO" и при завершении
указанной подпрограммы завершается.
Одна команда job может иметь несколько параметров, для каждого из них выполняется запуск дочернего процесса в очерёдности слева
направо.
Значение jobarg вычисляется как строка и рассматривается как перечисление параметров команды job, в том числе и нескольких.
MiniMono difference
В MiniM Embedded Edition команда JOB не поддерживается.
3.10
KILL
Удаляет значение переменной и её подиндексы, если они есть.
Синтаксис
K[ILL][:pc]
K[ILL][:pc] varname
K[ILL][:pc] ssvn
K[ILL][:pc] killname[,killname2,...]
K[ILL][:pc] (lockvarname1[,lockvarname2,...])
K[ILL][:pc] @killarg
Определение
pc
Постусловное выражение.
82
varname
ssvn
killname
lockvarname
killarg
ГЛАВА 3. КОМАНДЫ
Имя локальной или глобальной переменной.
Имя структурной системной переменной, если она
это допускает.
Имя локальной, глобальной или структурной системной переменной, если она это допускает.
Имя локальной переменной.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Безаргументная форма команды kill удаляет все локальные переменные, видные на текущем уровне стека. Но это не значит, что будут
удалены дубли этих имён на предыдущих уровнях стека. Если переменная была заведена на уровне 1, а потом снова заведена командой new на
уровне 2, то на уровне 2 команда kill удаляет дубль уровня 2, оставляя
переменную уровня 1.
Удаление локальной или глобальной переменной
При задании имени локальной или глобальной переменной она удаляется, включая все её подиндексы. Если переменная глобальная и для
её базы данных включено журналирование, то в журнал записывается
запись об удалении и, впоследствии, команда trollback (если включена
транзакция) сможет восстановить предыдущее значение этой переменной. Удаление локальных переменных не журналируется. Пример:
kill ^abc
kill a,b,c
Если удаляется переменная, на которую была установлена блокировка, то её удаление на блокировку никак не влияет. Это относится и к
локальным и к глобальным переменным.
Удаление структурной переменной допускается только в частных случаях и не для всех структурных переменных. В каждом конкретном
случае производимое командой kill действие определяется структурной
переменной. Например, удаление из структурной переменной ˆ$LOCK
приводит к удалению блокировки, а из структурной переменной ˆ$JOB
- к завершению указанного процесса.
3.10. KILL
83
Исключающая форма команды kill удаляет все локальные переменные, кроме указанных в списке. В списке могут быть указаны исключительно локальные переменные без индексов. Глобальные и структурные
переменные не могут быть указаны. Например:
TEMP>s a=1,b=2,c=3,d=4
TEMP>w
a=1
b=2
c=3
d=4
TEMP>k (b,d)
TEMP>w
b=2
d=4
TEMP>
Косвенная форма команды kill вычисляет killarg как строку и к полученному значению применяет команду kill. В полученном значении
должна быть корректная для команды kill конструкция с именами локальных, глобальных или структурных переменных. Например:
TEMP>s a=1,b=2,c=3,d=4
TEMP>s killarg="b,d"
TEMP>k @killarg
TEMP>w
a=1
c=3
killarg="b,d"
TEMP>
При удалении несуществующей переменной никаких действий не
производится.
84
3.11
ГЛАВА 3. КОМАНДЫ
KSUBSCRIPTS
Удаляет подиндексы переменной, если они есть.
Синтаксис
KS[UBSCRIPTS][:pc]
KS[UBSCRIPTS][:pc] varname
KS[UBSCRIPTS][:pc] killname[,killname2,...]
KS[UBSCRIPTS][:pc] (lockvarname1[,lockvarname2,...])
KS[UBSCRIPTS][:pc] @killarg
Определение
pc
varname
killname
lockvarname
killarg
Постусловное выражение.
Имя локальной или глобальной переменной.
Имя локальной или глобальной переменной.
Имя локальной переменной.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Безаргументная форма команды ksubscripts удаляет все локальные
переменные, видные на текущем уровне стека, за исключением их неиндексированных значений. Но это не значит, что будут удалены дубли
этих имён на предыдущих уровнях стека. Если переменная была заведена на уровне 1, а потом снова заведена командой new на уровне 2,
то на уровне 2 команда ksubscripts удаляет дубль уровня 2, оставляя
переменную уровня 1.
Удаление локальной или глобальной переменной
При задании имени локальной или глобальной переменной удаляются
все её подиндексы, за исключением неиндексированного значения. Если
переменная глобальная и для её базы данных включено журналирование,
то в журнал записывается запись об удалении и, впоследствии, команда
trollback (если включена транзакция) сможет восстановить предыдущее
3.12. KVALUE
85
значение этой переменной. Удаление локальных переменных не журналируется. Пример:
ksubscripts ^abc
ksubscripts a,b,c
Если удаляется переменная, на которую была установлена блокировка, то её удаление на блокировку никак не влияет. Это относится и к
локальным и к глобальным переменным.
Применение команды ksubscripts к структурным системным переменным не допускается и при выполнении генерируется ошибка <COMMAND>.
Это не связано со спецификой структурных системных переменных, это
запрет на применение команды ksubscripts к ним.
Исключающая форма команды ksubscripts удаляет все индексированные значения локальных переменных, кроме указанных в списке и
оставляет их неиндексированные значения. В списке могут быть указаны исключительно локальные переменные без индексов. Глобальные и
структурные переменные не могут быть указаны.
Косвенная форма команды ksubscripts вычисляет killarg как строку и
к полученному значению применяет команду ksubscripts. В полученном
значении должна быть корректная для команды ksubscripts конструкция
с именами локальных или глобальных.
При удалении несуществующей переменной никаких действий не
производится.
3.12
KVALUE
Удаляет значение переменной, не затрагивая её подиндексы.
Синтаксис
KV[ALUE][:pc]
KV[ALUE][:pc] varname
KV[ALUE][:pc] killname[,killname2,...]
KV[ALUE][:pc] (lockvarname1[,lockvarname2,...])
KV[ALUE][:pc] @killarg
Определение
pc
Постусловное выражение.
86
varname
killname
lockvarname
killarg
ГЛАВА 3. КОМАНДЫ
Имя локальной или глобальной переменной.
Имя локальной или глобальной переменной.
Имя локальной переменной.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Безаргументная форма команды kvalue удаляет все локальные переменные, видные на текущем уровне стека, но только их неиндексированные значения. Все индексы этих переменных оставляются без изменений.
Но это не значит, что будут удалены дубли этих имён на предыдущих
уровнях стека. Если переменная была заведена на уровне 1, а потом снова заведена командой new на уровне 2, то на уровне 2 команда kvalue
удаляет дубль уровня 2, оставляя переменную уровня 1.
Удаление локальной или глобальной переменной
При задании имени локальной или глобальной переменной она удаляется, за исключением всех её подиндексов. Если переменная глобальная
и для её базы данных включено журналирование, то в журнал записывается запись об удалении и, впоследствии, команда trollback (если
включена транзакция) сможет восстановить предыдущее значение этой
переменной. Удаление локальных переменных не журналируется. Пример:
kvalue ^abc
kvalue a,b,c
Если удаляется переменная, на которую была установлена блокировка, то её удаление на блокировку никак не влияет. Это относится и к
локальным и к глобальным переменным.
Применение команды kvalue к структурным системным переменным
не допускается и при выполнении генерируется ошибка <COMMAND>.
Это не связано со спецификой структурных системных переменных, это
запрет на применение команды kvalue к ним.
Исключающая форма команды kvalue удаляет все локальные переменные, кроме указанных в списке, при этом не затрагивает их индексированные значения. В списке могут быть указаны исключительно
3.13. LOCK
87
локальные переменные без индексов. Глобальные и структурные переменные не могут быть указаны.
Косвенная форма команды kvalue вычисляет killarg как строку и к полученному значению применяет команду kvalue. В полученном значении
должна быть корректная для команды kvalue конструкция с именами
локальных или глобальных.
При удалении несуществующей переменной никаких действий не
производится.
3.13
LOCK
Устанавливает или удаляет блокировку переменной.
Синтаксис
L[OCK][:pc]
L[OCK][:pc] glvn[:to]
L[OCK][:pc] glvn[:to][,glvn2[:to2],...]
L[OCK][:pc] (glvn1[,glvn2...])[:to]
L[OCK][:pc] +glvn[:to]
L[OCK][:pc] +(glvn1[,glvn2...])[:to]
L[OCK][:pc] -glvn
L[OCK][:pc] @lockarg
Определение
pc
glvn
lockarg
to
Постусловное выражение.
Имя локальной или глобальной переменной.
Косвенное выражение с аргументами команды.
Тайм-аут ожидания в секундах.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда lock устанавливает или удаляет блокировку локальной или
88
ГЛАВА 3. КОМАНДЫ
глобальной переменной. Блокировка - это внутренний объект сервера
MiniM, видимый одновременно всеми процессами инсталляции. Блокировка устанавливается на имя или локальной или глобальной переменной.
Сама переменная для блокирования не обязана существовать и иметь
значение. Также не требуется существование базы данных глобальной
переменной, если база данных задаётся. База данных не проверяется,
поэтому могут быть использованы имена баз данных, которые не являются допустимыми именами. Если база данных глобальной переменной
опущена, то базой считается текущая база данных текущего процесса.
Имеющиеся в сервере блокировки возвращаются структурной системной переменной ˆ$LOCK. Выделенные блокировки могут быть сняты,
не используя команду lock, а используя команду kill применительно к
структурной системной переменной ˆ$LOCK. Если команда lock может
снять лишь блокировки, установленные только текущим процессом, то
kill ˆ$LOCK может снять блокировку, установленную любым процессом.
Блокировки, установленные процессом, автоматически удаляются при
его завершении. Если процесс уничтожен нештатными средствами, то
сервер MiniM автоматически запускает процесс-гвардиан по очистке переменных процесса, который, в том числе, удаляет установленные уничтоженным процессом блокировки. В этом случае блокировки уничтожаются после выполнения операции отката транзакции так, чтобы соблюсти корректность конкурентного доступа процессов к данным.
Блокировки выполняются таким образом, что MiniM не позволяет
одновременно двум и более процессам выполнить блокирование одного
и того же имени, а также выполнить блокирование переменной более
низкого или более высокого уровня по дереву индексов этой переменной. Не допускается, таким образом, одновременная блокировка ветви
дерева одним процессом и его же поддерева другим процессом. Ситуация обнаруживается процессами MiniM для полностью раскрытых имён,
если это имена глобальных переменных.
В случае обнаружения такой коллизии команда lock вводит процесс
в состояние ожидания, пока не будет создано условие разрешения блокирования. В случае задания тайм-аута выражение to вычисляется как
число секунд ожидания. Может быть указано дробное число. Число приводится к целому числу миллисекунд. Время ожидания отсчитывается
от начала выполнения команды lock. В случае если тайм-аут ожидания
не указан, команда ожидает разрешения коллизии неограниченное время. В этом случае программистам надлежит самостоятельно принимать
решения о недопущении ситуации мертвых блокировок (deadlock).
Если была указана величина тайм-аута, то процесс MiniM вносит ин-
3.13. LOCK
89
формацию об успешности блокирования в системную переменную $test.
Таким образом, если тайм-аут не был указан, то выполнение последующей после команды lock команды означает, что блокировка получена.
А если тайм-аут был указан, то значение системной переменной $test
= 1 показывает, что блокировка получена, а значение 0 показывает, что
блокирование получено не было, и команда завершилась по тайм-ауту.
При снятии блокировки, независимо от формы её снятия, имя (а также имена более высокого и более низкого уровня) становится доступным
для блокирования иными процессами той же инсталляции MiniM.
Блокировки разных инсталляций MiniM не оказывают влияния друг
на друга, даже если две или более инсталляций MiniM работают одновременно.
При установке блокировки и её последующем снятии в рамках транзакции блокировки сохраняются процессом MiniM до окончания транзакции. При окончании транзакции процесс MiniM проверяет, какие блокировки были назначены на снятие в рамках транзакции и выполняет их
действительное снятие.
Безаргументная форма
lock
Безаргументная форма команды lock удаляет все блокировки, установленные текущим процессом на локальные и глобальные переменные,
вне зависимости от их количества и была ли установлена хоть одна
блокировка.
Блокирование имени
lock glvn
В качестве имени glvn могут указываться имена локальных или глобальных переменных с возможным указанием индексов. Имена глобальных переменных могут указываться как с именем базы данных, так и
без него. Если база данных не указана, то используется текущая база
данных. При этом действуют общие соглашения об отображении имён имена, начинающиеся с символа %, реально принадлежат базе данных
%sys, а имена, начинающиеся с имени mtemp, реально принадлежат базе
данных temp.
При блокировании имён команда lock предварительно выполняет снятие всех блокировок, в том числе даже если была установлена блокировка на блокируемое имя. После чего блокирует одно указанное имя.
Например, при выполнении кода
90
ГЛАВА 3. КОМАНДЫ
lock a,b,c
команда lock сначала снимет все блокировки, установленные процессом,
потом поставит блокировку на переменную a, потом снимет её и поставит
блокировку на переменную b, потом снимет её и поставит блокировку
на переменную c. В результате выполнения команды блокированной окажется лишь переменная c, а не все три как это может показаться.
При блокировании имени счётчик блокировок имени устанавливается
в единицу.
Блокирование списком
lock (glvn1,glvn2,glvn3)
При блокировании списком команда lock предварительно снимает все
установленные процессом блокировки, после чего ожидает возможности
блокирования всех перечисленных в списке имён. Как только становится
возможным блокирование всех имен сразу, процесс MiniM устанавливает на эти имена блокировки и команда lock возвращает управление.
На каждое имя в списке, при успехе получения блокировки, устанавливается счётчик блокировок на 1.
Инкрементальная блокировка
lock +glvn
Инкрементальная форма блокирования не удаляет установленных ранее процессом блокировок, а изменяет (увеличивает или уменьшает на
1) счётчик блокирований.
Инкрементальная блокировка увеличивает счётчик блокировок на
единицу для указанного имени. При обнаружении возможности установления блокировки процесс MiniM устанавливает блокировку и счётчик
блокировок увеличивается на единицу. Если блокировка на эту переменную уже была установлена, то счётчик увеличивается на единицу.
Обратной операцией уменьшения счётчика блокировок на единицу и
без затрагивания остальных имён является операция декрементальной
блокировки:
lock -glvn
Для операции уменьшения счётчика блокировок указание тайм-аута
не поддерживается. Уменьшение счётчика блокировок может выполняться в том числе для переменных, которые не были заблокированы текущим процессом. В этом случае никаких действий не предпринимается. При уменьшении счётчика блокировок до нуля блокировка снимается полностью. Исключением является установка и снятие блокировки
3.14. MERGE
91
в рамках транзакции - блокировка реально удаляется при выполнении
завершения транзакции либо командой tcommit, либо командой trollback
до нулевого уровня транзакции ($tlevel = 0).
Инкрементальная блокировка списком
lock +(a,b,c)
Инкрементальная блокировка списком является комбинацией блокирования списком и инкрементальной блокировки. Процесс ожидает возможности выполнить блокирование на единицу всех имён одновременно.
Как только ему это становится возможным сделать, имена вносятся в
список блокировок, если их там не было, и для всех этих имён счётчик
блокировок увеличивается на единицу.
При выполнении инкрементальной блокировки списком, как и при
выполнении инкрементальной блокировки одного имени, процесс MiniM
не удаляет имеющиеся блокировки.
Обратной операцией является операция декрементальной блокировки
списком:
lock -(a,b,c)
В этом случае всем перечисленным именам счетчик блокировок уменьшается на единицу.
Косвенная форма
Косвенная форма lock применяет команду lock к значению выражения
lockarg так, как если бы это значение было записано в коде. В выражении lockarg должна быть синтаксически корректно указана одна из форм
аргумента lock, кроме безаргументной формы.
3.14
MERGE
Копирует данные из одной локальной или глобальной переменной в другую локальную или глобальную переменную с подиндексами.
Синтаксис
M[ERGE][:pc] glvn1=glvn2[,glvn3=glvn4,...]
M[ERGE][:pc] @mergearg
Определение
92
pc
glvn
mergearg
ГЛАВА 3. КОМАНДЫ
Постусловное выражение.
Имя локальной или глобальной переменной.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда merge копирует данные из переменной glvn2 в переменную
glvn1. В качестве имён могут быть указаны как глобальные, так и локальные переменные. Не допускается использование системных, структурных системных переменных и просто вычисляемых значений.
Допускается указание имён переменных с индексами.
Команда merge копирует дерево из исходной переменной в целевую
переменную, начиная со значения glvn2 и для каждого имеющегося в
ней узла. Дерево присоединяется в указанную переменную glvn1 с замещением значений, если они там были. Например:
TEMP>s a(1)=1,a(1,2)=12,a(1,3)=13,a(1,2,4)=124
TEMP>s b(2)=2,b(2,1)=21,b(2,2)=22,b(2,4,5)=245
TEMP>w
a(1)=1
a(1,2)=12
a(1,2,4)=124
a(1,3)=13
b(2)=2
b(2,1)=21
b(2,2)=22
b(2,4,5)=245
TEMP>merge b(2)=a(1)
TEMP>w
a(1)=1
a(1,2)=12
a(1,2,4)=124
3.15. NEW
93
a(1,3)=13
b(2)=1
; значение замещено
b(2,1)=21
; значение осталось
b(2,2)=12
; значение замещено
b(2,2,4)=124 ; значение вставлено
b(2,3)=13
; значение вставлено
b(2,4,5)=245 ; значение осталось
Команда merge не производит удаления ни значения переменной glvn1,
ни её подиндексов. Поэтому следует внимательно относиться к трактовке команды merge как операции копирования.
При использовании косвенной формы команды merge в значении вычисляемого выражения mergearg должна быть синтаксически корректная
конструкция вида:
glvn1=glvn2
В случае если команда merge должна выполнить копирование дерева
в само себя, то MiniM генерирует ошибку <COMMAND>. Эта операция
запрещена стандартом. Вхождение исходного дерева в целевое проверяется даже в том случае, когда требуется выполнить копирование дерева
в переменную, переданную в подпрограмму по ссылке и имеющую формальное имя, отличное от фактического.
Команда merge не требует, чтобы переменная glvn и какой-либо из
её подиндексов существовали. В этом случае ничего не копируется в
переменную glvn1. И если переменная glvn1 не существовала, то она и
не создаётся.
Имена переменных glvn1 и glvn2 могут быть указаны как есть или с
произвольными косвенными выражениями.
3.15
NEW
Создаёт на стеке новую локальную переменную.
Синтаксис
N[EW][:pc]
N[EW][:pc] lvn
N[EW][:pc] lvn[,lvn2,...]
N[EW][:pc] (lvn1[,lvn2...])
94
ГЛАВА 3. КОМАНДЫ
N[EW][:pc] lvn=expr[,lvn2=expr2,...]
N[EW][:pc] svn[=expr]
N[EW][:pc] @newarg
Определение
pc
lvn
svn
expr
newarg
Постусловное выражение.
Имя локальной переменной без подиндексов.
Имя системной переменной, к которой допустимо
применение команды new.
Произвольное выражение.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда new заводит на текущем уровне стека место для локальной
переменной. На каждом уровне стека могут существовать локальные переменные с одинаковыми именами и иметь собственные значения. Если
управление программой покидает уровень стека, то все локальные переменные, созданные на нём командой new, автоматически уничтожаются,
и память, которую они занимали, освобождается.
Команда new создаёт место под локальную переменную без присваивания ей значения, и при обращении к ней процесс MiniM генерирует
ошибку <UNDEFINED>. Все последующие присваивания этой локальной переменной производятся с этой копией, не затрагивая переменные
с тем же именем, созданные на другом уровне стека. Если команда new
вызывается повторно, то место, занимаемое переменной, освобождается,
и она снова принимает неопределённое значение. Исключение - инициализирующая форма new, которая одновременно с заведением переменной
присваивает ей значение.
Команда new оперирует только корневыми именами локальных переменных без индексов. Команда new не оперирует системными структурными переменными и глобалами. Команда new может использоваться
совместно с ограниченным перечнем системных переменных.
Безаргументная форма
3.15. NEW
95
new[:pc]
Безаргументная форма new удаляет значения всех локальных переменных, созданных на текущем уровне стека, и отмечает, что последующее заведение локальных переменных через присваивание даже тех,
которые не были созданы командой new, должны создаваться на этом
же уровне стека.
Перечисление переменных
new[:pc] var1[,var2...]
При перечислении имён локальных (и отдельных системных) переменных команда new применяется только к этим именам. Если имя на
этом уровне стека имело значение, то значение удаляется, если на этом
уровне стека этой переменной не было заведено, то имя заводится и принимает неопределённое значение. Команда new с перечислением имён
через запятую функционально эквивалентна нескольким командам new,
применённым отдельно к каждому имени. Например:
new a,b,c
функционально полностью эквивалентно коду
new a new b new c
Различие состоит в использовании постусловия. Коды
new:expr a,b,c
и
new:expr a new:expr b new:expr c
отличаются тем, что в первом случае выражение expr вычисляется только один раз, а во втором случае - три раза для каждого имени. Соответственно, если при вычислении постусловия есть побочные эффекты или
использование имён, входящих в аргумент, то поведение программы в
этих двух случаях может быть различным.
Форма new с перечислением допускает комбинирование через запятую имён исключающей формы, инициализирующей формы и косвенной
формы.
Исключающая форма
96
ГЛАВА 3. КОМАНДЫ
new[:pc] (a,b,c)
Исключающая форма new создаёт на текущем стеке отметку, что все
последующие обращения к локальным переменным производятся так,
как если бы они были заведены командой new и получили неопределённое значение. Это относится ко всем именам, кроме перечисленных
в круглых скобках. Все имена, попадающие под это условие и заведённые на текущем уровне стека, теряют свои значения. Все последующие
присваивания автоматически создают значения на этом уровне стека.
Исключающая форма new не может быть разбита на эквивалентные
отдельные команды. Коды
new (a,b,c)
new (a) new (b) new (c)
не являются эквивалентными, потому что после выполнения второго варианта будут потеряны все значения, а после выполнения первого останутся значения переменных a,b,c.
Инициализирующая форма
new var=expr
Эта форма new не входит в стандарт M[UMPS] и является расширением языка MiniM. Форма является сокращённым комбинированием
команд new и set. Инициализирующая форма new полностью эквивалентна команде new с перечислением имён и последующим присваиванием значения. В отличие от команды set, в этой форме new может быть
присвоено значение только корневому имени, нельзя указывать имя локальной переменной без индексов.
В инициализирующей форме new, кроме имён локальных переменных, может использоваться ограниченный перечень системных переменных.
Косвенная форма
new[:pc] @newarg
Косвенная форма new применяет команду new к значению выражения
newarg, как если бы это значение было записано в коде. В выражении
newarg должна быть синтаксически корректно указана одна из форм
аргумента new, кроме безаргументной формы.
NEW с системными переменными
3.16. OPEN
97
new[:pc] svn
Команда new может быть применена к ограниченному перечню имён
системных переменных.
$etrap
$estack
$test
$reference
Код обработчика ошибок.
Уровень стека обработчика ошибок.
Значение индикатора успешности операции.
Значение последней глобальной ссылки.
Эти системные переменные могут быть использованы как аргументы
команды new.
При применении new к системной переменной на стеке отводится
место для её значения. Последующие обращения к этой переменной на
чтение и запись производятся к этому значению на стеке. В случае если
на стеке не было создано место для системной переменной, обращения
производятся к месту на предыдущем уровне стека.
К переменным $etrap, $test, $reference может быть применена инициализирующая форма new.
При применении new к переменной $estack значение $estack на текущем уровне стека обнуляется. При создании следующего уровня стека
значение $estack автоматически увеличивается на 1. И также, впоследствии, может быть обнулено командой new. При возврате управления
на предыдущий уровень стека значение $estack принимает то значение,
которое было на предыдущем уровне стека.
Возврат по стеку при наличии ранее выполненных операций new
$reference изменяет значение $reference, как и значение $test, без выполнения собственно самих операций с локальными переменными, устройствами или глобалами.
3.16
OPEN
Открывает устройство ввода-вывода с указанными параметрами.
Синтаксис
O[PEN][:pc] dev[:(params)][:to][:mnemonicspace]
O[PEN][:pc] dev...[,dev2...,...]
O[PEN][:pc] @openarg
Определение
98
pc
dev
param
params
to
mnemonicspace
openarg
ГЛАВА 3. КОМАНДЫ
Постусловное выражение.
Имя устройства.
Параметр устройства.
Параметры устройства, перечисленные через двоеточие.
Таймаут ожидания открытия.
Выражение, содержащее имя рутины.
Выражение, задающее параметры команды косвенно.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда open открывает указанное в выражении dev устройство вводавывода и вносит его в перечень открытых устройств. Устройство текущим не делается. Если устройство, идентифицируемое значением выражения dev, уже было открыто текущим процессом, то никаких действий
не предпринимается, и параметры игнорируются.
Проверить, открыто ли устройство, можно, обратившись к структурной системной переменной ˆ$DEVICE.
В MiniM поддерживается одновременное открытие устройств с одинаковым именем разными процессами. Например, несколько процессов
могут открыть на ввод-вывод один и тот же файл. Одновременно могут
быть открыты несколько однотипных устройств одним процессом. Например, несколько файлов или коммуникационных устройств TCP/IP. Не
могут быть одновременно одним процессом открыты устройства, имеющие одинаковую строку идентификации. Например, для того чтобы дважды открыть один и тот же файл, нужно чтобы имя файла отличалось
регистром, по крайней мере, одного символа.
В случае, когда указано время ожидания открытия устройства, команда open пишет в системную переменную $test индикатор успешности открытия 1, если открылось, и 0, если не открылось. Для таймаута
используется единица измерения секунда, точность миллисекунда. Таймаут отсчитывается от начала выполнения команды.
Если команда open не смогла определить тип открываемого устройства, MiniM генерирует ошибку <DEVICE>.
Для того чтобы указать пропуск необязательных параметров открытия, требуется, тем не менее, синтаксически указать двоеточия. По ним
3.17. QUIT
99
команда open определяет, какие параметры заданы. Например, можно
опустить параметры открытия, оставив их значения по умолчанию, параметр ожидания и указать рутину обработки мнемоник:
open "|FILE|c:\temp\dat.txt":::"MNSPACE"
Если указывается два или более параметров открытия, то их необходимо брать в круглые скобки. Если параметр только один, то круглые
скобки необязательны.
При косвенном задании аргументов команды требуется, чтобы после
вычисления выражения openarg в полученной строке были синтаксически корректные параметры. В этом случае команда open применяется к
указанным аргументам. Пустая строка не допускается.
Подробное описание специфических для типов устройств ввода-вывода
параметров открытия находится ниже в соответствующей главе.
3.17
QUIT
Завершает выполнение текущего контекста.
Синтаксис
Q[UIT][:pc]
Q[UIT][:pc] expr
Q[UIT][:pc] @quitarg
Определение
pc
expr
quitarg
Постусловное выражение.
Вычисляемое выражение.
Косвенный аргумент.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке.
Команда quit выполняет возврат из текущего контекста выполнения.
Контекст выполнения создаётся исполнением строки команд в интерактивном режиме, при вводе команд из файла (в пакетном режиме), при
выполнении команд do, for, xecute и при вызове пользовательской функции.
100
ГЛАВА 3. КОМАНДЫ
Команда quit прекращает выполнение текущего цикла (команды for),
если находится в той же строке.
Команда quit прекращает выполнение строки команд команды xecute
и последующие за ней команды не выполняются.
У команды quit не поддерживается перечисление нескольких аргументов. Команда возвращает только первое значение.
В косвенной форме после вычисления постусловия сначала вычисляется значение quitarg, после чего содержание строки рассматривается
как синтаксическое выражение, оно вычисляется и команда возвращает
это значение.
При выполнении команды quit в контексте блочного do команда quit
прекращает выполнение текущего блока команд.
При выполнении строки пользовательской функции команда quit прекращает её выполнение и возвращает значение из пользовательской функции.
Безаргументная форма команды quit ничего не возвращает, форма с
аргументом возвращает значение из пользовательской функции. Аргументная форма quit не может использоваться для прекращения команд
do, for и xecute. В этом случае генерируется ошибка <COMMAND>.
Если требуется вызывать подпрограмму в различных случаях как с
возвращаемым значением, так и без него, то программисту необходимо использовать значение системной переменной $quit. Если значение
равно 0, значит для возврата управления должна использоваться безаргументная форма команды quit, иначе требуется возвращаемое значение.
При выполнении команды quit в строке интерактивного режима (например, консоль или телнет) указание возвращаемого значения допустимо, значение вычисляется, но утрачивается.
Примеры:
TEMP>f i=1:1:5 w i,! q:i=3
1
2
3
TEMP>x "w 12,! q
12
TEMP>
w 34"
3.18. READ
101
3.18 READ
Вводит значение из текущего устройства ввода-вывода в указанную переменную.
Синтаксис
R[EAD][:pc] glvn[#len][:to]
R[EAD][:pc] *glvn[:to]
R[EAD][:pc] /mnemonic[(params)]
R[EAD][:pc] ?intexpr
R[EAD][:pc] constexpr
R[EAD][:pc] format
R[EAD][:pc] readarg[,readarg2,...]
R[EAD][:pc] @indreadarg
Определение
pc
glvn
len
to
constexpr
format
readarg
indreadarg
Постусловное выражение.
Имя локальной или глобальной переменной для помещения результата чтения.
Вычисляемое выражение, используемое как целое
число, максимальное число вводимых байт.
Вычисляемое выражение, используемое как число,
задающее время ожидания ввода.
Константа, строка.
Один из символов форматирования вывода.
Один из допустимый аргументов - имя локальной или
глобальной переменной, символ форматирования или
мнемоника.
Вычисляемое выражение, значение которого задают
аргументы команды косвенно.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
102
ГЛАВА 3. КОМАНДЫ
Команда read проводит чтение байт из текущего устройства вводавывода. Команда read имеет опции чтения как строки (последовательности байт), так и одного байта. При этом команда read принимает аргументы, аналогичные аргументам команды write по управлению форматированием, и может выводить в текущее устройство ввода-вывода строку
для оформления ввода, не производя никакого чтения.
Команда read имеет необязательные параметры - ограничители длины
и времени ввода.
При чтении команда read использует назначенные текущему устройству ввода - вывода ограничители чтения (терминаторы). При их появлении во входном потоке команда прекращает чтение и возвращает всё, что
было прочитано в указанную переменную. При этом сами терминаторы
в переменную не записываются.
При окончании чтения команда read записывает последнюю введённую последовательность в системную переменную $key.
По умолчанию, обычно, устройствам назначены терминаторы текстового режима. При вводе ENTER в $key пишется байт 13, при вводе
ESCAPE в $key пишется байт 27.
В случае использования коммуникационных устройств ввода-вывода,
в зависимости от их типа, чтение с тайм-аутом может как поддерживаться, так и не поддерживаться в силу технических причин.
Если команде read задан параметр тайм-аут, то это выражение вычисляется как число и считается как количество секунд ожидания ввода.
Число может быть указано дробным, вычисляется до целого числа миллисекунд. Время тайм-аута - это полное время ожидания ввода всей
порции данных от момента начала выполнения команды read.
При выполнении ввода до истечения времени тайм-аута (или был
ввод терминатора или было исчерпание ограничения длины ввода) команда read пишет в системную переменную $test значение 1, если же
чтение окончилось по истечении тайм-аута, то результат чтения пишется в указанную переменную (сколько было прочитано), и в системную
переменную $test пишется значение 0.
Задание и ограничение длины чтения и ограничение тайм-аута необязательны, но если они указаны, то синтаксически они должны следовать
в порядке ограничения длины, за ним ограничение времени. Если ограничение длины не указано, то действует соглашение об автоматическом
ограничении в 32 килобайт на строку. Если тайм-аут не указан, то чтение выполняется неограниченно либо до достижения предельной длины,
либо до достижения терминатора.
Чтение строки
3.18. READ
103
read glvn
При передаче команде read имени локальной или глобальной переменной команда проводит чтение из текущего устройства ввода-вывода
в эту переменную. Условия чтения обусловливаются типом устройства,
назначенным ему терминаторами чтения, ограничением длины чтения и
времени чтения.
В качестве имени могут быть заданы как корневое имя переменной,
так и индексированное.
Чтение кода символа
read *glvn
При указании символа (*) перед именем локальной или глобальной
переменной команда read проводит ввод одного байта. Условия чтения
обусловливаются типом устройства и временем ожидания ввода. При
успешном чтении в переменную glvn помещается численный код прочитанного символа. Например:
TEMP>r *ch
w
TEMP>w
ch=119
Коды символов считаются от 0 до 255.
По истечении времени ожидания в переменную помещается код -1, и
в системную переменную $test пишется значение 0.
Вывод табулятора
Табулирование задаётся символом вопросительного знака(?), за которым следует выражение, задающее позицию по горизонтали. Табулирование применяется к устройствам, поддерживающим отсчет по горизонтали. К ним относятся консоль (|CON|) и телнет (|TNT|) интерфейс.
Для остальных устройств поведение табулирования не определено и выполняется в зависимости от типа устройства.
Выражение вычисляется как число и задаёт номер позиции знакоместа по горизонтали на той же строке, до которой следует вывести
пробелы. MiniM производит отсчет позиции насколько это возможно
(значения возвращаются системными переменными $X и $Y).
Если вычисленное значение меньше или равно нулю, то отступ не
выполняется. Иначе из вычисленного значения вычитается текущая позиция по горизонтали, и на полученную величину выполняется вывод
104
ГЛАВА 3. КОМАНДЫ
пробелов. Значение может превышать размер экрана по горизонтали, тогда производится вывод пробелов с созданием новых строк. Дальнейший
вывод проводится с полученной позиции. Примеры:
r #!!!,?15,"Enter name: ",name
Здесь очищается экран, выводится три пустых строки, пробелы до
15-го символа, потом выводится строка "Enter name: " и вводится строка
в переменную name.
Использование мнемоник
При использовании мнемоник имя мнемоники должно быть задано
явно, косвенные формы задания имени мнемоники не поддерживаются. Значения, передаваемые мнемоникам, могут передаваться только как
значения. Не допускается пропускание параметров и передача имён локальных переменных по ссылке. Значения могут быть опущены, но в
этом случае вызываемая подпрограмма должна принять меры к обработке неопределённых формальных параметров. Имя мнемоники обязательно предваряется наклонной чертой. Например:
read /CUP(10,20),answer
Здесь вызывается подпрограмма обработки CUP в рутине обработки
мнемоник, назначенной текущему устройству с передачей двух значений.
При обращении к мнемоникам, в случае если текущему устройству
не назначена рутина обработки или назначена несуществующая рутина,
MiniM генерирует ошибку <MNEMSPACE>, код MDC 26. При обращении к мнемонике, которая не определена в рутине обработки, генерируется ошибка <NOLINE>.
Вывод константной строки
При задании в качестве аргумента команды read константной величины - строки или числа эта величина приводится к строке и выводится
в текущее устройство. Например:
TEMP>r "Enter your name: ",name
Enter your name: John
TEMP>w
name="John"
TEMP>
3.19. SET
105
Здесь строка "Enter your name: " сначала была выведена, потом было
чтение строки John в переменную name.
Задание форматирования
Форматирование задаётся следующими символами:
#
Символ задаёт очистку экрана для интерактивных
устройств или сброс буферов для коммуникационных
устройств.
Символ задаёт перевод строки.
!
Для текстовых режимов в устройство выводятся символы $c(13),$c(10),
для бинарных режимов выводится символ $c(10).
Если команде read задаются следующие друг за другом символы форматирования ! и #, то разделение их запятыми необязательно. Например,
код
read #!!!
сначала очищает экран, устанавливает курсор на верхнюю строку, после
чего выполняет вывод трёх пустых строк.
Косвенная форма
Команде read могут быть переданы параметры косвенно через значение вычисляемого выражения indreadarg. После вычисления значения
в нём должна быть синтаксически корректная строка с перечислением
допустимых для команды read параметров. Пустая строка в качестве значения не поддерживается. Косвенная форма задания аргументов может
быть использована наравне с остальными через запятую.
3.19
SET
Присваивает значение локальным, глобальным или некоторым системным переменным.
Синтаксис
S[ET][:pc] setleft=expr[,setleft2=expr2]
S[ET][:pc] (setleft[,setleft2...])=expr
S[ET][:pc] @setarg
Определение
106
pc
setleft
expr
setarg
ГЛАВА 3. КОМАНДЫ
Постусловное выражение.
Объект присваивания.
Вычисляемое выражение, значение присваивания.
Косвенное выражение с аргументами команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда set вычисляет значение выражения expr и присваивает это
значение одному или нескольким объектам присваивания. Если объектов
присваивания несколько, то выражение expr вычисляется один раз, и это
значение присваивается всем объектам присваивания, перечисленным в
скобках в очерёдности слева направо. Например:
TEMP>s (a,b,c)=123
TEMP>w
a=123
b=123
c=123
TEMP>s (a,b,c)=$i(d)
TEMP>w
a=1
b=1
c=1
d=1
В качестве выражения setleft могут использоваться:
lvn
gvn
$KEY
$X
Имя локальной переменной как индексированное,
так и нет.
Имя глобальной переменной как индексированное,
так и нет.
Системная переменная $KEY.
Системная переменная $X.
3.19. SET
$Y
$DEVICE
$ECODE
$ETRAP
$ZTRAP
$extract()
$list()
$piece()
$qsubscript()
$bit()
107
Системная переменная $Y.
Системная переменная $DEVICE.
Системная переменная $ECODE.
Системная переменная $ETRAP.
Системная переменная $ZTRAP.
Функция $extract().
Функция $list().
Функция $piece().
Функция $qsubscript().
Функция $bit().
Присваивание локальной переменной
При присваивании значения локальной переменной значение присваивается только указанному имени. Присваивание переменной производится на уровне стека, определённом командой new.
Если такой переменной не было, то она автоматически создаётся.
Если переменная имела значение, то оно перезаписывается. Могут быть
указаны как корневые имена, так и индексированные.
Имя локальной переменной может быть задано косвенно.
Присваивание глобальной переменной
При присваивании значения глобальной переменной значение присваивается только указанному имени. Если такой глобальной переменной не
было, то она создаётся. Если это имя имело значение, то оно перезаписывается.
Имя может быть задано как с указанием имени базы данных, так и
без него. Если имя базы данных не указано, то используется текущая
база данных.
Имя может быть указано как непосредственно, так и косвенно, как
корневое, так и индексированное.
Имя глобальной переменной может быть задано с использованием
голой ссылки (naked indicator).
В случае если для текущего процесса и базы данных включено (по
умолчанию включено) журналирование, то запись об изменении глобальной переменной также производится в журнал, и это изменение,
впоследствии, может быть возвращено командой trollback.
Побочным эффектом присваивания глобальной переменной является изменение значения голой ссылки (naked undicator). Голая ссылка
получает значение этого имени. Текущее значение голой ссылки возвращается системной переменной $zreference.
108
ГЛАВА 3. КОМАНДЫ
Присваивание системной переменной $key
При присваивании значения системной переменной $key присваивание выполняется для $key только текущего устройства ввода-вывода.
При смене текущего устройства значение $key примет значение $key
для него.
Присваивание системным переменным $X и $Y
При присваивании значений системным переменным $x и $y значения expr вычисляются как целые числа и присваиваются значениям $x и
$y. Побочным эффектом присваивания является позиционирование курсора для устройств консоли (|CON|) и телнет (|TNT|). При присваивании
значений системным переменным $x и $y производится управление позицией курсора. Для консоли (|CON|) выполняется прямое управление
консолью Windows, для телнета (|TNT|) выполняется посылка управляющей эскейп-последовательности. Для телнета (|TNT|) позиционирование
на экране должен выполнить телнет-клиент.
Присваивание системной переменной $ecode
При присваивании значения expr системной переменной $ecode значение запоминается в переменной $ecode. Предыдущее значение $ecode
утрачивается. В системную переменную $zerror пишется строка <ECODETRAP>.
После присваиваний выполняется генерация ошибки <ECODETRAP>.
В случае присвоения переменной $ecode пустой строки генерации,
ошибки не производится, системная переменная $zerror не изменяет значение, значение $ecode сбрасывается в пустую строку.
Присваивание системной переменной $etrap
При присваивании значения переменной $etrap присваивание выполняется на уровне стека, на котором эта переменная была заведена командой new либо, если такой команды не было, то на самом верхнем
уровне стека. Предыдущее значение переменной $etrap на этом уровне
стека утрачивается.
При обработке ошибок значение переменной $etrap используется как
строка кода, которая выполняется при обработке ошибки. Но при присваивании синтаксическая корректность значения expr не проверяется.
Присваивание системной переменной $ztrap
Присваивание системной переменной $ztrap является синонимом присваиванию системной переменной $etrap и применению команд new к
системным переменным $estack и $etrap.
3.19. SET
109
Обработчик ошибок установленный через присваивание системной
переменной $ztrap не является самостоятельным отдельным механизмом обработки ошибок, а является альтернативой установке значений
системным переменным $estack и $etrap. Сам обработчик ошибок вызывается командой goto. При присваивании значения системной переменной $ztrap производится анализ его содержания и выполняются операции с присваиванием и new с системными переменными $estack и $etrap
в зависимости от содержания $ztrap.
В значении системной переменной $ztrap допускается либо имя метки для перехода по команде goto либо метка и дополнительный символ
"*" перед ней.
Если значение $ztrap при присваивании содержит только метку, то
при этом выполняется код эквивалентный коду:
new $estack
new $etrap
set $etrap="g:’$es "_$ztrap
Это соответствует раскручиванию стека выполнения до уровня на котором был установлен обработчик и переходу на обработчик по команде
goto.
Если значение $ztrap при присваивании содержит символ "*" перед
меткой, то при этом выполняется код эквивалентный коду:
set $etrap="g "_$e($ztrap,2,$l($ztrap))
Это соответствует переходу на обработчик ошибок на уровне стека,
на котором возникла ошибка.
Пример:
USER>s $zt="err^errhandler"
USER>w $et
g:’$es err^errhandler
USER>s $zt="*err^errhandler"
USER>w $et
g err^errhandler
В случае если системной переменной $ztrap присваивается значение
не соответствующее ни одной допустимой форме, то MiniM генерирует
ошибку <SYNTAX>.
110
ГЛАВА 3. КОМАНДЫ
Присваивание функции $list()
При присваивании функции $list() выполняется присваивание переменной, передаваемой ей первым аргументом сконструированной специальным образом строки. Строка формируется по правилам формата списка.
Если переменная на этот момент имела неопределённое значение, то
она создаётся. Если имела определённое значение, то рассматривается
как строка в формате списка.
При использовании одноаргументной формы присваивания функции
$list() выполняется замещение первого элемента списка или его создание.
При использовании двухаргументной формы присваивания функции
$list() выполняется замещение указанного элемента, где номер элемента указывается вторым аргументом. Если вторым аргументом указано
значение 0, то выполняется замещение первого элемента. Если указано значение -1, то выполняется замещение последнего элемента списка.
Если указанный элемент списка имел неопределённое или определённое
значение, то после присваивания он получает определённое значение, и
оно равно выражению expr.
Если указан номер элемента за пределами имеющихся элементов
списка, то недостающие элементы создаются и получают неопределённое
значение.
При использовании трёхаргументной формы присваивания функции
$list() производится замещение подсписка, начиная с указанной во втором аргументе позиции по указанную в третьем аргументе позицию.
Если в качестве второго аргумента указано значение -1, то выполняется
замещение подсписка, начиная с последнего элемента, и третий аргумент
игнорируется.
В случае если вторым аргументом передаётся значение меньше, чем
-1, то функция генерирует ошибку <RANGE>.
В случае если функция присваивания обнаруживает нарушение формата представления списка, то она генерирует ошибку <LIST>.
В случае если функция присваивания обнаруживает, что для построения списка недостаточно предела строки в 32 килобайт, то она генерирует ошибку <MAXSTRING>.
Примеры:
TEMP>s $li(list)=2
TEMP>f i=1:1:$ll(list) w $lg(list,i),!
3.19. SET
111
2
TEMP>k
s $li(list,4)="a"
TEMP>f i=1:1:$ll(list) w $lg(list,i,"def"),!
def
def
def
a
TEMP>s $li(list,2,3)=$lb("w","r")
TEMP>f i=1:1:$ll(list) w $lg(list,i,"def"),!
def
w
r
a
Таким образом, чтобы удалить из списка элементы с n по m включительно, можно использовать трёхаргументную форму:
TEMP>s list=$lb(1,2,3,4) s $li(list,2,3)=""
TEMP>f i=1:1:$ll(list) w $lg(list,i,"def"),!
1
4
И, например, чтобы сделать заданный элемент списка неопределённым, можно заместить его подсписком из одного неопределённого элемента:
TEMP>s list=$lb(1,2,3,4)
TEMP>s $li(list,3,3)=$lb()
TEMP>f i=1:1:$ll(list) w $lg(list,i,"def"),!
1
2
def
4
112
ГЛАВА 3. КОМАНДЫ
Присваивание функции $piece()
При присваивании функции $piece выполняется присваивание переменной, передаваемой ей первым аргументом сконструированной соответствующим образом строки. Строка формируется как строка с разделителями, второй параметр указывает разделитель. Третий параметр
указывает, какую часть строки требуется заместить, четвёртый параметр указывает, по какую часть исходной строки следует выполнить
замещение. В случае если в исходной строке не хватает позиций, то они
дополняются пустой строкой через указанный разделитель.
Если в переменной не было значения, то оно создаётся, и отсутствующее значение рассматривается как пустая строка.
В качестве первого параметра можно передавать имена локальных и
глобальных переменных как индексированных, так и нет.
Примеры:
TEMP>s str="a,b,c" s $p(str,",")="d" w str
d,b,c
TEMP>s str="a,b,c" s $p(str,",",2)="d" w str
a,d,c
TEMP>s str="a,b,c" s $p(str,",",1,2)="d" w str
d,c
TEMP>s str="a,b,c" s $p(str,",",8)="d" w str
a,b,c,,,,,d
В качестве разделителя могут использоваться как односимвольные,
так и многосимвольные пустые строки. Например:
TEMP>s str="a,,b,,c" s $p(str,",,",2)="d" w str
a,,d,,c
TEMP>s str="a,,b,,c" s $p(str,"",8)="d" w str
a,,b,,cd
Присваивание функции $extract()
При присваивании функции $extract выполняется замещение подстроки в переменной, имя которой указано первым аргументом. Второй
3.19. SET
113
и третий (необязательные) аргументы указывают позиции строки, которые требуется заместить. Присваиваемое значение может отличаться
по длине от замещаемой подстроки. В этом случае выполняются либо
увеличение, либо уменьшение длины строки.
Если второй аргумент не указан, то он считается равным 1, и замещается первый символ. Иначе замещение выполняется с указанной в нём
позиции.
Если третий аргумент не указан, то он считается равным второму, и
выполняется замещение первого символа. Иначе выполняется замещение
по указанную позицию.
Если второй аргумент отрицательный, то изменение строки не выполняется, и значение голой ссылки (naked indicator) не изменяется. Если
третий аргумент меньше второго, то изменение значения переменной и
голой ссылки также не выполняется.
Если до присваивания значения переменной не существовало, то эта
переменная создаётся.
Если выполняется замещение подстроки после последнего символа
строки, то недостающие позиции в строке дополняются символами пробела.
Примеры:
TEMP>s str="abc",$e(str)=1 w
str="1bc"
TEMP>s str="abc",$e(str,-2)=1 w
str="abc"
TEMP>s str="abc",$e(str,1,2)=1 w
str="1c"
TEMP>s str="abc",$e(str,5)=1 w
str="abc 1"
TEMP>s str="abc",$e(str,5,8)=1 w
str="abc 1"
Присваивание функции $qsubscript()
При присваивании функции $qsubscript выполняется изменение переменной, указанной в качестве первого аргумента. При этом значение
114
ГЛАВА 3. КОМАНДЫ
переменной рассматривается как имя переменной. При присваивании выполняется замена в этом имени его части. Заменяемая часть указывается вторым аргументом функции $qsubscript. Если указана величина -1,
то имя заменяется на глобальное имя, и ему изменяется область. Если
указано значение 0, то заменяется корневое имя переменной. Иначе заменяется значение индекса переменной. Если у имени нет индексов до
указанной позиции, то они дополняются пустыми строками.
Примеры:
TEMP>s name=$na(abc(1,2,3))
TEMP>s $qs(name,4)=4
TEMP>w
name="abc(1,2,3,4)"
TEMP>s $qs(name,0)="def"
TEMP>w
name="def(1,2,3,4)"
TEMP>s $qs(name,-1)="ggg"
TEMP>w
name="^|"ggg"|def(1,2,3,4)"
TEMP>s $qs(name,8)="8"
TEMP>w
name="^|"ggg"|def(1,2,3,4,"","","",8)"
При присваивании функции $qsubscript при задании неверных значений позиции, либо при передаче синтаксически некорректного имени,
генерируется ошибка <FUNCTION>. В остальных случаях выполняется
присваивание, и если первый аргумент - имя глобальной переменной, то
выполняется изменение голой ссылки (naked indicator).
Присваивание функции $bit()
При присваивании функции $bit первым ее аргументом должно быть
имя локальной или глобальной переменной. При выполнении присваивания выполняется запись бита в строку специального формата. Если
3.19. SET
115
именем переменной является имя глобальной переменной и для базы данных этой переменной включено журналирование, то выполняется также
запись в журнал о предыдущем значении бита в этой битовой строке.
Запись выполняется о логическом значении - если переменная не имела занчение или бит был за пределами строки, то считается что был
нулевой бит.
Второй аргумент указывает номер позиции от 1 до 262104 включительно. Присваиваемое значение приводится к числу и сравнивается с
нулем. Если получен ноль, то записывается нулевой бит, иначе единичный.
При присваивании функции $bit если переменной не было то она
создается. Если в переменной было записано значение не соответствующее формату битовой строки, то генерируется ошибка <INVALID BIT
STRING>. Если в качестве позиции указано недопустимое значение, выходящее за пределы допустимого диапазона, то генерируется ошибка
<RANGE>.
Присваивание бита в строку глобальной переменной выполняется атомарно - между определением предыдущего значения и модификацией
строки никакой другой процесс не может изменить значение этой битовой строки.
При откате транзакции выполняется восстановление логического, а
не физического состояния битовой строки. Например, если строки не
было, и в нее был записан бит в позиции N, то предыдущим логическим
значением было нулевое значение этого бита, при откате транзакции
будет восстановлено значение нулевого бита в этой строке и переменная будет содержать значение, хотя в начале транзакции она не имела
значения.
Примеры:
USER>s $bit(abc,3)=1
USER>s $bit(abc,5)=1
USER>f i=1:1:10 w i," : ",$bit(abc,i),!
1 : 0
2 : 0
3 : 1
4 : 0
5 : 1
116
ГЛАВА 3. КОМАНДЫ
6 : 0
7 : 0
8 : 0
9 : 0
10 : 0
USER>w $bitcount(abc)
5
USER>w $bitcount(abc,1)
2
USER>w $bitcount(abc,0)
3
Здесь в примере производится запись в несуществующую переменную единичного бита в позиции 3, после чего в уже существующую
переменную делается запись как в битовую строку единичного бита в
позицию 5. После этого выводятся значения битов от 1 до 10, охватывая
в том числе несуществующие биты строки. Для них выводятся нулевые значения. Общее количество битов показывается как 5, количество
единичных битов 2, количество нулевых 3.
Косвенная форма set
При использовании косвенной формы set в качестве значения аргумента должна присутствовать синтаксически корректная для присваивания строка в виде
что = значение
Допустимые для присваивания пары определяются допустимыми формами команды set. Значение setarg, в свою очередь, также может содержать косвенные формы задания как аргумента set, так и имён переменных. Например:
TEMP>s setarg="a=$i(b)"
TEMP>s @setarg
TEMP>w
a=1
b=1
setarg="a=$i(b)"
3.21. TROLLBACK
3.20
117
TCOMMIT
Подтверждает уровень транзакции.
Синтаксис
TC[OMMIT][:pc]
Определение
Постусловное выражение.
pc
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке.
Команда tcommit выполняет в журнале отметку о подтверждении
уровня транзакции. Уровень транзакции понижается на единицу.
Если уровень транзакции был равен нулю, то команда генерирует
ошибку <COMMAND>.
Если после выполнения команды tcommit уровень транзакции понижается до нуля, то отменить сделанные изменения уже нельзя. Процесс
производит отметку о полном подтверждении всех уровней транзакции
в журнале.
В случае если уровень транзакции больше единицы, то для подтверждения всех уровней требуется выполнить соответствующее количество
команд tcommit.
3.21
TROLLBACK
Отменяет транзакцию целиком.
Синтаксис
TRO[LLBACK][:pc]
Определение
pc
Постусловное выражение.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке.
118
ГЛАВА 3. КОМАНДЫ
Команда trollback отменяет всю транзакцию целиком, все уровни до
нулевого уровня, делает в журнале отметку, что транзакция отменена, и
процесс MiniM утрачивает внутренний уникальный номер транзакции.
Все сделанные журналируемыми глобалами изменения возвращаются
в состояние, которое было до выполнения изменений, сделанных в этой
транзакции. Изменения возвращаются либо в физически аналогичное
состояние, либо в логически аналогичное, в зависимости от операции с
данными в глобалах. В текущей версии MiniM все откаты транзакции
выполняются с физически полным восстановлением.
Команда trollback не откатывает изменения в глобалах, сделанные
функцией $increment.
Если при выполнении команды trollback транзакционного контекста
не было (уровень транзакции 0), то команда ничего не выполняет, никакие ошибки не генерируются.
MiniM не поддерживает параметры команды trollback. При указании
последовательностей, означающих параметры отката транзакции, генерируется ошибка <UNIMPLEMENTED>.
3.22
TSTART
Начинает транзакцию или новый уровень в транзакции.
Синтаксис
TS[TART][:pc]
Определение
pc
Постусловное выражение.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке.
Команда tstart начинает новый уровень транзакции. Уровень транзакции возвращается как число системной переменной $tlevel. При старте
процесса транзакционный контекст отсутствует ($tlevel возвращает 0) в
целях совместимости с программами MUMPS, написанными до появления в стандарте этой команды.
Команда tstart при повторных вызовах увеличивает уровень вложения транзакции на единицу. Максимальный поддерживаемый MiniM
уровень транзакций равен 255. При его достижении генерируется ошиб-
3.23. USE
119
ка <TLEVEL>. Пример:
TEMP>f i=1:1:300 ts
<TLEVEL>
TEMP>w $tl
255
TEMP>tro
TEMP>w $tl
0
TEMP>w i
256
Команда tstart, создавая контекст транзакции, вводит автоматическую отметку в журнал, и все последующие изменения в журналируемых
глобалах попадают в журнал с отметкой о номере транзакции. Каждая
транзакция в MiniM имеет свой внутренний уникальный номер, по которому подсистема автовосстановления и подсистема отката транзакции
ориентируются в записях журнала.
MiniM не поддерживает аргументы команды tstart. Указание любых
последовательностей, означающих параметры транзакции, приводит к генерации ошибки <UNIMPLEMENTED>. Также не поддерживается косвенная форма задания параметров. Пример:
TEMP>ts
TEMP>w $tl
1
TEMP>tro
TEMP>w $tl
0
TEMP>
3.23
USE
Делает указанное устройство ввода-вывода текущим и применяет к нему
параметры использования.
Синтаксис
120
ГЛАВА 3. КОМАНДЫ
U[SE][:pc] dev[:param][,dev2[:param2],...]
U[SE][:pc] dev[:(params)]
U[SE][:pc] dev[:[params]:mnemonicspace]
U[SE][:pc] @usearg
Определение
pc
dev
param
params
mnemonicspace
usearg
Постусловное выражение.
Имя устройства.
Параметр устройства.
Параметры устройства, перечисленные через двоеточие.
Выражение, содержащее имя рутины.
Выражение, задающее параметры команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда use делает текущим устройство ввода-вывода, идентифицируемое строкой dev. Устройство должно быть предварительно открыто
командой open или быть созданным автоматически при старте процесса
(устройством по умолчанию). Если устройство не является предварительно открытым, MiniM генерирует ошибку <NOTOPEN>.
Все операции ввода-вывода всегда выполняются с текущим устройством ввода-вывода, поэтому для использования устройства, которое не
является текущим, его следует сделать текущим командой use.
При возврате в интерактивный режим работы (консоль |CON|, телнет |TNT|, стандартное |STD|) MiniM автоматически делает текущим
устройством устройство ввода-вывода по умолчанию (основное устройство), выполняя действие
use $principal
Значения pc, dev, mnemonicspace, usearg и значения в параметрах
могут задаваться как вычисляемые выражения. Перед выполнением команды все эти выражения вычисляются слева направо, в порядке оче-
3.24. WRITE
121
редности их написания, после чего вычисленные значения используются
командой use.
Команда use может быть применена к любому открытому процессом устройству ввода-вывода, в том числе повторно для текущего. Если
команде use заданы через запятую несколько устройств, то команда применяется последовательно слева направо к каждому, и в итоге текущим
делается устройство, указанное в списке последним.
Параметр mnemonicspace задаёт имя рутины, которая содержит подпрограммы обработки мнемоник. Например:
use $io::"COMMON"
или
use $io:():"COMMON"
Здесь рутиной обработки мнемоник для устройства $io делается рутина ˆCOMMON. При этом параметры использования опущены как неиспользуемые.
При использовании косвенной формы требуется, чтобы значение usearg
после вычисления представляло собой допустимую синтаксическую конструкцию, задающую один или более аргументов команды use, возможно, перечисленные через запятую. В случае косвенной формы выражение
usearg сначала вычисляется, потом к нему применяется команда use.
Параметры использования являются специфическими для каждого
типа устройства ввода-вывода и описаны ниже в соответствующей главе
руководства.
После выполнения команды use текущее устройство ввода-вывода
возвращается системной переменной $io. Возвращается строка идентификации устройства без параметров.
3.24
WRITE
Выводит значение в текущее устройство ввода-вывода.
Синтаксис
W[RITE][:pc]
W[RITE][:pc] expr
W[RITE][:pc] *intexpr
W[RITE][:pc] ?intexpr
W[RITE][:pc] writeformat
122
ГЛАВА 3. КОМАНДЫ
W[RITE][:pc] /mnemonic[(params)]
W[RITE][:pc] writearg[,writearg2,...]
W[RITE][:pc] @indwritearg
Определение
pc
expr
intexpr
writeformat
mnemonic
params
writearg
indwritearg
Постусловное выражение.
Вычисляемое выражение, используемое как строка.
Вычисляемое выражение, используемое как число.
Один из символов форматирования вывода.
Имя мнемоники, метка в рутине обработки мнемоник.
Одно или более вычисляемых значений, передаваемых мнемонике как параметры, разделённые запятой.
Один из допустимых аргументов команды write.
Вычисляемое выражение, значение которого задают
аргументы команды косвенно.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда write производит вывод символов в текущее устройство
ввода-вывода и управляет форматированием вывода. Команда write всегда оперирует текущим устройством ввода-вывода и в случае использования мнемоник всегда используется рутина обработки мнемоник, назначенная на текущее устройство.
Безаргументная форма
Безаргументная форма команды write выводит список локальных переменных текущего процесса, имеющих значения, и сами их значения.
Выводятся лишь имена переменных, имеющие значения на текущем
уровне стека. Переменная, заведённая командой new, но не получившая
значения, не выводится.
Безаргументная форма команды write выводит имена в сортированном порядке по возрастанию имён и их подиндексы в порядке индексной
сортировки.
3.24. WRITE
123
Если значение переменной во внутреннем представлении MiniM есть
строка, то значение заключается в двойные кавычки без удвоения кавычек, принадлежащих самой строке. Если во внутреннем представлении
MiniM значение не является строкой, а есть число, то при выводе значения кавычки не ставятся.
Для получения синтаксически корректного дампа значений следует пользоваться расширенной системной функцией $zquote(), которая
добавляет в строку как удвоение двойных кавычек, так и обрамление
кавычками строки, если в строке не число.
Примеры:
TEMP>s a(1)=1,b(1)="1",b("1 1")="1 1"
TEMP>w
a(1)=1
b(1)="1"
b("1 1")="1 1"
TEMP>
Здесь значения переменных a(1) и b(1) вывелись по-разному, поскольку во внутреннее представление значения попали в первом случае, как
результат вычисления числа, а во втором случае, как результат вычисления строки.
Вывод значения как строки
Команда write при задании в качестве аргумента вычисляемого выражения без специальных символов форматирования приводит вычисленное значение к строке и выводит её значение в текущее устройство как
есть, байт за байтом. Пример:
TEMP>w "2*2=",2*2
2*2=4
Здесь у команды write два аргумента. Первый аргумент вычисляется
как строка и выводит строку "2*2=", второй - это выражение из умножения. После вычисления значение приводится к строке и выводится в
текущее устройство.
Вывод числа как символа
Команда write при задании формата как символа * вычисляет следующее за ним выражение как целое число и рассматривает младший байт
124
ГЛАВА 3. КОМАНДЫ
полученной величины как код символа, который следует вывести в текущее устройство. Преобразователь формата функционально практически
эквивалентен использованию функции $char() с одним аргументом.
TEMP>w *65
A
TEMP>w $c(65)
A
Различие в том, что во втором случае производится вывод строки, и
хотя она из одного символа, MiniM всё равно принимает меры к подсчёту полученной позиции как по горизонтали, так и по вертикали и к
коррекции текущих значений $X и $Y. В первом же случае коррекция
координат не производится.
Вывод табулятора
Табулирование задается символом вопросительного знака (?), за которым следует выражение, задающее позицию по горизонтали. Табулирование применяется к устройствам, поддерживающим отсчет по горизонтали. К ним относятся консоль |CON| и телнет |TNT| интерфейс.
Для остальных устройств поведение табулирования не определено и выполняется в зависимости от типа устройства.
Выражение вычисляется как число и задаёт номер позиции знакоместа по горизонтали на той же строке, до которого следует вывести
пробелы. MiniM производит отсчёт позиции на сколько это возможно
(значения возвращаются системными переменными $X и $Y).
Если вычисленное значение меньше или равно нулю, то отступ не
выполняется. Иначе из вычисленного значения вычитается текущая позиция по горизонтали, и на полученную величину выполняется вывод
пробелов. Значение может превышать размер экрана по горизонтали, тогда производится вывод пробелов с созданием новых строк. Дальнейший
вывод проводится с полученной позиции.
Примеры:
TEMP>w ?2,"*",?10,"*"
*
*
TEMP>s tab1=3,tab2=10
TEMP>w ?tab1,"*",?tab2,"*"
*
*
3.24. WRITE
125
Здесь выводится табулирование до второй позиции, затем символ *,
затем табулирование до десятой, затем снова символ *. Во втором примере значения табулирования задаются переменными. В качестве значений
могут быть использованы сложные выражения, они при работе команды
write вычисляются в очерёдности слева направо.
Задание форматирования
Форматирование задаётся следующими символами:
#
Символ задаёт очистку экрана для интерактивных
устройств или сброс буферов для коммуникационных.
Символ задаёт перевод строки.
!
Для текстовых режимов в устройство выводятся символы $c(13),$c(10),
для бинарных режимов выводится символ $c(10).
Если команде write задаются следующие друг за другом символы
форматирования ! и #, то разделение их запятыми необязательно. Например, код
write #!!!
сначала очищает экран, устанавливает курсор на верхнюю строку, после
чего выполняет вывод трёх пустых строк.
Использование мнемоник
При использовании мнемоник имя мнемоники должно быть задано
явно, косвенные формы задание имени мнемоники не поддерживаются. Значения, передаваемые мнемоникам, могут передаваться только как
значения. Не допускается пропускание параметров и передача имён локальных переменных по ссылке. Значения могут быть опущены, но в
этом случае вызываемая подпрограмма должна принять меры к обработке неопределённых формальных параметров. Имя мнемоники обязательно предваряется наклонной чертой. Например:
write /CUP(10,20)
Здесь вызывается подпрограмма обработки CUP в рутине обработки
мнемоник, назначенной текущему устройству с передачей двух значений.
При обращении к мнемоникам, в случае если текущему устройству
не назначена рутина обработки или назначена несуществующая рутина,
126
ГЛАВА 3. КОМАНДЫ
MiniM генерирует ошибку <MNEMSPACE>, код MDC 26. При обращении к мнемонике, которая не определена в рутине обработки, генерируется ошибка <NOLINE>.
Косвенная форма
Команде write могут быть переданы параметры косвенно через значение вычисляемого выражения indwritearg. После вычисления значения
в нём должна быть синтаксически корректная строка с перечислением
допустимых для команды write параметров. Пустая строка в качестве
значения не поддерживается. Косвенная форма задания аргументов может быть использована наравне с остальными через запятую, например:
TEMP>write #,/CUP(10,20),@line,!
TEMP>f expr="2*2","5*5","6*6" w expr,"=",@expr,!
2*2=4
5*5=25
6*6=36
3.25
XECUTE
Выполняет выражение как строку с командами.
Синтаксис
X[ECUTE][:pc1] expr[:pc2][,expr2,...]
Определение
pc
expr
Постусловное выражение.
Выражение, команды которого выполнить.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда xecute выполняет строку expr, трактуя её как последовательность команд. Значение expr вычисляется после вычисления постусловного выражения.
3.25. XECUTE
127
В строке expr могут отсутствовать команды и присутствовать комментарии.
В значении выражения expr должна отсутствовать метка. Первые
символы expr рассматриваются как начало команды, пробел или комментарий.
При выполнении команды xecute MiniM создаёт новый уровень стека. При завершении выполнения строки уровень стека покидается. Если
на этом новом уровне стека заводились переменные, то они уничтожаются. Выполнение команды xecute аналогично выполнению команды do
для подпрограммы в одну строку со значением expr, за исключением
того, что системная функция $stack показывает, что было выполнение
команды не do, а команды xecute. Например:
TEMP>x "n a s a=1"
TEMP>w
TEMP>
Если постусловное выражение pc1 присутствует и вычисляется как не
ноль, то команда применяется ко всем своим аргументам, перечисленным
через запятую. Если постусловное выражение pc2 вычисляется как не
ноль, то команда применяется к выражению expr. Если же выражение
pc2 вычисляется как ноль, то команда к выражению expr не применяется,
и команда xecute переходит к выполнению следующего своего аргумента.
Например:
TEMP>x "w 1":1
1
TEMP>x "w 1":0
TEMP>
При выполнении команды xecute системная переменная $test не стекуется, и в случае ее изменения при выполнении команды xecute значение $test также изменяется на предыдущем уровне стека, а также выше,
если их контекст вызова не защищает значение $test от изменения. См.
описание системной переменной $test.
128
ГЛАВА 3. КОМАНДЫ
Глава 4
Z - Команды
4.1
ZNEW
Команда создает на стеке локальную переменную с копированием в нее
предыдущего значения переменной вместе с подиндексами.
Синтаксис
ZNEW[:pc]
ZNEW[:pc] lvn[,lvn2,...]
ZNEW[:pc] (lvn[,lvn2,...])
ZNEW[:pc] @argindir
Определение
lvn
pc
argindir
Имя локальной переменной, которое надо создать на
текущем уровне стека.
Выражение постусловия, вычисляется перед выполнением команды. Команда не выполняется, если выражение вычисляется как значение 0.
Значение с косвенным заданием аргументов команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
129
130
ГЛАВА 4. Z - КОМАНДЫ
одному из них.
Команда znew аналогична команде new с тем расширением что в созданной переменной сохраняются значения предыдущей переменной полностью, включая подиндексы, в то время как после выполнения команды
new значения этой переменной на текущем уровне стека утрачиваются.
Безаргументная форма команды znew применяется ко всем имеющимся на текущем уровне стека локальным переменным. Безаргументная
форма znew не имеет последствий для несуществующих имен переменных, в отличие от безаргументной формы команды new.
Исключающая форма команды znew применяется ко всем имеющимся
на текущем уровне стека локальным переменным кроме перечисленных
в списке. Исключающая форма znew не имеет последствий для несуществующих имен переменных, в отличие от исключающей формы команды
new.
Примеры:
USER>s a=0,a(1)=1 x "znew
a=0
a(1)=1
w"
USER>s a=0,a(1)=1 x "znew
a=0
a(1)=1
a(2)=2
a=0
a(1)=1
s a(2)=2 w" w
USER>s a=0,a(1)=1,b="b" x "znew
a=0
a(1)=1
a(2)=2
b="b"
a=0
a(1)=1
b="b"
s a(2)=2 w" w
USER>s a=0,a(1)=1,b="b" x "znew
a=0
a(1)=1
s a(2)=2 s b=""c"" w" w
4.2. ZNSPACE
131
a(2)=2
b="c"
a=0
a(1)=1
b="b"
USER>s a=0,a(1)=1,b="b" x "znew a s a(2)=2 s b=""c"" w" w
a=0
a(1)=1
a(2)=2
b="c"
a=0
a(1)=1
b="c"
USER>s a=1,b=2 x "znew (a) s a=3,b=4,c=5 w
a=3
b=4
c=5
w !" w
a=3
b=2
c=5
Команда znew не входит в стандарт языка, это следует учитывать
программистами при проверке программ на соответствие уровню переносимости.
В качестве имени локальной переменной lvn допустимо указывать
только неиндексированные локальные переменные.
В качестве значения argindir допустимо применение значения произвольного выражения, содержащее перечисление через запятую неиндексированных имен локальных переменных или также, в свою очередь,
косвенное задание аргумента.
4.2
ZNSPACE
Команда переключает процесс в указанную базу данных, делая её текущей.
132
ГЛАВА 4. Z - КОМАНДЫ
Синтаксис
ZN[SPACE][:pc] expr[,expr] ZN[SPACE][:pc] @argindir
Определение
expr
pc
argindir
Выражение, значение которого используется как имя
базы данных для переключения.
Выражение постусловия, вычисляется перед выполнением команды. Команда не выполняется, если выражение вычисляется как значение 0.
Значение с косвенным заданием аргументов команды.
Команда переключает процесс в указанную базу данных, делая её
текущей для этого процесса. Имя базы данных используется нечувствительно к регистру. Если такой базы данных в конфигурации сервера MiniM не объявлено, то генерируется ошибка <NAMESPACE>,
код ошибки MDC 26 (обращение к несуществующему окружению).
TEMP>zn "not exist "
<NAMESPACE>
TEMP>w $ec
,M26,
TEMP>
Если текущая база данных совпадает с указанной, то никаких действий не предпринимается, побочных эффектов нет. Побочным эффектом при переключении в другую базу данных является очистка naked
indicator в значение пустая строка.
USER>w $d(^a)
10
USER>w $zr
^a
USER>zn "%sys"
%SYS>w $zr
%SYS>
4.3. ZPRINT
133
USER>znspace @"""%sys"""
%SYS>
Имя текущей для процесса базы данных сервера MiniM возвращается
системной переменной $znspace.
TEMP>w $znspace
TEMP
TEMP>
4.3
ZPRINT
Команда выводит в текущее устройство текст рутины или часть текста,
как указано в аргументе.
Синтаксис
ZP[RINT][:pc]
ZP[RINT][:pc] [label][+offset][ˆ[database]routine]
ZP[RINT][:pc] [label1][+offset1][ˆ[database]routine]:[label2][+offset2]
ZP[RINT][:pc] @argindir
Определение
label
offset
database
routine
argindir
Необязательная метка, указывающая с какой строки
необходимо начать вывод текста.
Смещение относительно строки для начала вывода.
Имя базы данных, в которой требуется взять текст
рутины.
Имя выводимой рутины.
Значение с косвенным заданием аргументов команды.
Команда может быть использована в 4-х формах:
1. В безаргументной форме команда выводит в текущее устройство
текст текущей исполняемой рутины.
2. При задании лишь имени рутины без метки первой строки и опционального указания последней строки команда выводит указанную
134
ГЛАВА 4. Z - КОМАНДЫ
рутину.
3. При задании первой метки без указания опциональной второй команда выводит текст одной указанной строки.
4. При указании обоих меток команда выводит текст рутины начиная
с первой по последнюю указанную включительно.
Перед выводом строк команда проверяет наличие самой рутины и
указанных строк. В случае если строки начала или окончания вывода не
найдены, или строка окончания вывода следует перед первой указанной,
то команда ничего не выводит в текущее устройство.
Синтаксис задания первой метки поддерживается в том же виде, как
и аргумент функции $TEXT, при этом любая часть аргумента может
быть задана косвенно. Произвольная часть аргумента может быть опущена, команда будет выполнять отсчет строк по тексту рутины ориентируясь на оставшиеся в спецификации аргумента указания. В случае
если имя рутины опущено, то используется текущая выполняемая рутина. Если опущено имя базы данных, то используется текущая база
данных.
USER>zp
Команда ничего не выводит, потому, что в контексте выполнения интерактивных команд еще нет текущей исполняемой рутины.
USER>zp ^uuuunnnn
Команда ничего не выводит, если указанной рутины нет.
USER>zp ^%DBCRC
%DBCRC ; MiniM system utilities, Check database CRC
n ans,list,i,dbname,err
s list=$v("db",15)
w !,"MiniM database CRC check utility",!
start
w !,"Available database list:",!
f i=1:1:$l(list,"*") w " ",i,") ",$p(list,"*",i)
r !,"Select database number to check: ",ans,!
i ’+ans q
s dbname=$p(list,"*",ans)
4.3. ZPRINT
135
i dbname="" q
s err=$v("db",21,dbname)
i err=0 w "Database ",dbname," CRC check database defect.",!
e w "Database ",dbname," CRC check OK.",!
g start
USER>
Команда выводит весь текст рутины, поскольку не было указано ограничений ввода.
USER>zp +3^%DBCRC
s list=$v("db",15)
Команда выводит одну указанную строку.
USER>zp +2^%DBCRC:+4
n ans,list,i,dbname,err
s list=$v("db",15)
w !,"MiniM database CRC check utility",!
Команда выводит строки с первой по последнюю указанную, используя указанные смещения.
USER>zp start^%DBCRC:start+4
start
w !,"Available database list:",!
f i=1:1:$l(list,"*") w " ",i,") ",$p(list,"*",i)
r !,"Select database number to check: ",ans,!
i ’+ans q
Команда выводит строки с первой по последнюю указанную, используя метки и смещения.
Нужно отметить, что второй опциональный аргумент, указывающий
на последнюю строку, не должен содержать имя рутины. Имя рутины
берется либо из первой части аргумента, либо используется имя текущей
исполняемой рутины.
Команда использует только INT рутины, не обращая внимание на
наличие рутин MAC или INC с тем же именем. В случае если в базе
данных присутствует компилированный байткод, но отстутствует исходный текст рутины, команда ничего не выводит.
136
4.4
ГЛАВА 4. Z - КОМАНДЫ
ZSYNC
Активирует демон записи и демон журнала.
Синтаксис
ZSYNC[:pc]
Определение
pc
Постусловное выражение.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке.
Команда zsync активирует сигнал демону записи изменённых блоков
кэша и демону записи кэша журнала. Процесс MiniM, вызвавший эту
команду, выставляет сигналы демонам. Управление возвращается сразу
после передачи сигналов.
Демоны, получив сигналы активации, начинают сброс изменённых
блоков кэша и накопленных записей журнала, не дожидаясь окончания
периода ожидания и вне зависимости от количества накоплённых изменений.
Демоны выполняют сброс изменений, накопленных всеми процессами
MiniM текущей инсталляции, не только изменений, сделанных процессом, вызвавшим команду zsync.
По возврату управления командой zsync нельзя сказать, что записи
кэша блоков и очереди журнала уже выполнились, поскольку управление возвращается после выставления сигналов, а не после окончания
сброса.
Даже если получить сигнал об окончании сброса кэша и очереди
журнала, нельзя гарантировать, что весь кэш полностью сброшен, поскольку возможны изменения в базе данных, пока демоны сбрасывают
на диск текущие изменения.
Команда предназначена для ускорения фиксации в файлах данных
накопленных изменений.
4.5
ZTRAP
Команда генерирует ошибку <ZTRAP>, или ошибку, заданную своим
аргументом.
4.5. ZTRAP
137
Синтаксис
ZT[RAP][:pc]
ZT[RAP][:pc] expr
ZT[RAP][:pc] @argindir
Определение
expr
pc
argindir
Выражение вычисляется и от его строкового представления берется до 32 символов для генерации
имени ошибки.
Выражение постусловия, вычисляется перед выполнением команды. Команда не выполняется, если выражение вычисляется как значение 0.
Значение с косвенным заданием аргументов команды.
Безаргументная форма команды ztrap генерирует ошибку <ZTRAP>.
Команда ztrap с аргументом генерирует ошибку с текстом, заданным
своим аргументом. От строкового представления аргумента берется до
32 символов. В текст ошибки пишется символ Z и символы от значения
аргумента.
Примеры:
USER>ztrap
<ZTRAP>
USER>w $ze
<ZTRAP>
USER>w $ec
,ZZTRAP,
USER>ztrap "MY ERROR"
<ZMY ERROR>
USER>w $ec
,ZZTRAP,ZZTRAP,
USER>w $ze
<ZMY ERROR>
USER>s errcode="Failed"
USER>ztrap @"errcode"
138
ГЛАВА 4. Z - КОМАНДЫ
<ZFailed>
4.6
ZWRITE
Команда выводит в текущее устройство имена и значения переменных.
Синтаксис
ZW[RITE][:pc]
ZW[RITE][:pc] glvn[,glvn2,...]
ZW[RITE][:pc] @argindir
Определение
glvn
pc
argindir
Имя локальной или глобальной переменной, которую
надо напечатать в текущее устройство вывода.
Выражение постусловия, вычисляется перед выполнением команды. Команда не выполняется, если выражение вычисляется как значение 0.
Значение с косвенным заданием аргументов команды.
Постусловное выражение вычисляется перед выполнением команды
как число и сравнивается с нулём. Если выражение не равно нулю,
то команда выполняется. Если равно нулю, то выполняется следующая
команда в строке. Если у команды указаны через запятую несколько
аргументов, то постусловие применяется ко всем аргументам. То есть
или команда применяется слева направо к каждому аргументу, или ни к
одному из них.
Команда zwrite без аргументов выводит в текущее устройство имена
и значения локальных переменных, включая их подиндексы.
Примеры:
TEMP>k
TEMP>s a="a",a(1)="a1",b="b",b(1)="b1"
TEMP>zw
a="a"
a(1)="a1"
4.6. ZWRITE
139
b="b"
b(1)="b1"
TEMP>
TEMP>zw @"a,b"
a="a"
a(1)="a1"
b="b"
b(1)="b1"
Если указано имя локальной или глобальной переменной, то выводится имя и значение как самой переменной, так и всех её подиндексов.
TEMP>zw a
a="a"
a(1)="a1"
TEMP>zw a(1)
a(1)="a1"
TEMP>
Если переменная, указанная в параметре, не существует, то это значение не выводится, и команда не генерирует ошибку <UNDEFINED> о
неопределённом значении.
TEMP>k
TEMP>s a(1)=1
TEMP>zw
a(1)=1
TEMP>zw a
a(1)=1
TEMP>
Команда zwrite выводит индексированные переменные в порядке индексной сортировки.
140
ГЛАВА 4. Z - КОМАНДЫ
В аргументах команды zwrite могут быть указаны через запятую
несколько имён локальных или глобальных переменных, в этом случае
команда zwrite последовательно применяется к каждому из этих имён
слева направо.
TEMP>k
TEMP>s a="a",b="b",c="c",d="d"
TEMP>zw a,c
a="a"
c="c"
TEMP>
4.7
ZZDUMP
Команда выводит в текущее устройство шестнадцатеричный дамп значения выражения.
Синтаксис
ZZDUMP[:pc] expr[,expr2,...]
ZZDUMP[:pc] @argindir
Определение
expr
pc
argindir
Выражение, значение которого выводится в шестнадцатеричном виде.
Выражение постусловия, вычисляется перед выполнением команды. Команда не выполняется, если выражение вычисляется как значение 0.
Значение с косвенным заданием аргументов команды.
Команда выводит в текущее устройство вывода шестнадцатеричный
дамп значения переменной, приведённого к строковому представлению.
Вывод осуществляется в три колонки: 1) позиция порции из 16 байт
(первая всегда 0000); 2) последовательность шестнадцатеричных кодов
байт и 3) колонка с печатным представлением (если оно имеется) для
каждого байта.
4.7. ZZDUMP
141
TEMP>zzdump $c(0,1,2,3,4,35,36,37,38,46,
47,48,78,79,80,220,230,240,241,255)
0000: 00 01 02 03 04 23 24 25
26 2E 2F 30 4E 4F 50 DC
.....#$%&./0NOP?
0001: E6 F0 F1 FF
жрся
В параметрах команды можно перечислить несколько значений через
запятую. Они будут вычисляться последовательно слева направо, и для
каждой будет выполняться шестнадцатеричный дамп.
TEMP>zzdump 123,456
0000: 31 32 33
0000: 34 35 36
USER>zzdump @"a,b"
0000: 31
0000: 33
123
456
1
3
Если параметр пустая строка, то шестнадцатеричный дамп не выполняется.
142
ГЛАВА 4. Z - КОМАНДЫ
Глава 5
Стандартные функции
5.1
$ASCII
Возвращает десятичное значение заданного ASCII символа.
Синтаксис
$A[SCII](Строка{,Позиция})
Определение
Строка
Позиция
Любое символьное выражение.
Целочисленное выражение, определяющее относительное расположение символа в Строке.
Функция $ASCII возвращает целочисленное значение, которое является десятичным эквивалентом кода ASCII заданного символа. Десятичное значение преобразуется из кода ASCII, который содержится в
Строке в определённой Позиции. Если позиция не указана, то она подразумевается равной 1. Функция выдаст значение, равное -1, если строка
пуста, или если значение Позиции меньше 1, или больше длины Строки.
Примеры:
Команда
S X="ABCDE"
S Y="4"
Значение функции
$A(X)=65
$A(X,1)=65
$A(X,2)=66
$A(X,3)=67
$A(X,Y)=68
143
144
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
S X=""
$A(X)=-1
$A(X,n)=-1 при всех n.
$A(X,0)=-1
$A(X,3)=-1
$A(X,-7)=-1
$A(X,1.92)=65 используется целая часть
значения.
S X="AB"
5.2
$BIT
Возвращает значение бита (0 или 1) из битовой строки в указанной
позиции.
Синтаксис
$BIT(bitstring,position)
Определение
bitstring
position
Битовая строка, полученная с помощью $bit функций.
Вычисляемое выражение, позиция бита.
Функция $bit() возвращает значение бита из заданной битовой строки в указанной позиции. Если строка не соответствует формату битовых строк, с которыми работают функции $bit, то генерируется ошибка
<INVALID BIT STRING>. Если значение position выходит за допустимые пределы, то генерируется ошибка <RANGE>. Допустимый предел
position - от 1 до 262104 включительно.
Если в качестве bitstring указана неопределенная переменная или
значение пустая строка, то всегда возвращается значение 0. Если указано значение position за пределами имеющихся в bitstring битов, то
всегда возвращается значение 0.
Примеры:
USER>s $bit(a,3)=1,$bit(a,6)=1
USER>f i=1:1:10 w $bit(a,i)
0010010000
5.3. $BITCOUNT
145
5.3 $BITCOUNT
Возвращает количество битов в указанной битовой строке.
Синтаксис
$BITCOUNT(bitstring[,bitvalue])
Определение
bitstring
bitvalue
Битовая строка, полученная с помощью $bit функций.
Вычисляемое выражение, значение бита (0 - не 0).
Функция $bitcount() в одноаргументной форме возвращает общее количество бит в битовой строке, в двухаргументной форме возвращает
количество единичных или нулевых битов. При задании двухаргументной формы значение bitvalue приводится к чслу и сравнивается с нулем.
Если результат 0, то возвращается количество нулевых битов, иначе
возвращается количество единичных битов.
При задании в качестве bitstring переменной имеющей неопределенное значение или выражения пустая строка возвращается значение 0.
Если в качестве значения bitstring передается значение, не соответствующее по формату битовым строкам с которыми работают функции
$bit, то генерируется ошибка <INVALID BIT STRING>.
Примеры:
USER>s $bit(a,3)=1,$bit(a,12)=1
USER>w $bitcount(a)
12
USER>w $bitcount(a,1)
2
USER>w $bitcount(a,0)
10
USER>w $bitcount(aaaaa)
0
USER>w $bitcount(123)
<INVALID BIT STRING>
146
5.4
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$BITFIND
Возвращает позицию бита с заданным значением в заданной битовой
строке.
Синтаксис
$BITFIND(bitstring,bitvalue[,position[,direction]])
Определение
bitstring
bitvalue
position
direction
Битовая строка в которой требуется поиск.
Значение бита которое требуется найти.
Если задано то означает номер позиции, с которой
включительно следует проводить поиск.
Если задано то означает направление поиска - по
возрастанию позиции или по убыванию.
Функция $bitfind() возвращает номер позиции в битовой строке в
которой присутствует заданное значение бита. В случае если не найдено
возвращает значение 0.
В случае если в качестве bitstring передано имя переменной не имеющей значение или передано значение пустая строка функция возвращает
значение 0.
В случае если в качестве значения bitstring передано значение не
соответствующее по своему внутреннему формату битовой строке с которым работаю функции $bit генерируется ошибка <INVALID BIT STRING>.
В качестве bitvalue принимается вычисляемое значение, которое приводится к числу и сравнивается с нулем. Если это значение 0, то ищется
позиция нулевого бита, иначе ищется позиция единичного бита.
Функция отсчитывает позиции бита от единицы, начальная позиция
- 1.
Если задано значение position, то поиск производится начиная с указанной позиции. Если позиция указана меньше чем 1, то поиск производится с первой позиции. Если значение position не указано (используется двухаргументная форма $bitfind), то производится поиск с первой
позиции.
Если задано значение direction, то оно вычисляется как число и
сравнивается с значениями 1 или -1. Если задано значение 1, то производится поиск по возрастанию позиции, если задано значение -1, то
по убыванию позиции. При иных значениях поиск генерируется ошибка
<FUNCTION>. Если значение direction не задано (используется двух-
5.5. $BITLOGIC
147
или трехаргументная форма $bitfind), то поиск производится по возрастанию позиции.
Примеры:
USER>s $bit(a,3)=1,$bit(a,5)=1
USER>s i=0 f
3
5
s i=$bitfind(a,1,i+1) q:’i
w i,!
USER>s i=0 f
1
2
4
s i=$bitfind(a,0,i+1) q:’i
w i,!
Здесь создается битовая строка с единичными битами в позициях 3
и 5, после чего выводятся позиции единичных и нулевых битов.
5.5
$BITLOGIC
Выполняет битовые операции И, ИЛИ, НЕ над битовыми строками и
возвращает результат.
Синтаксис
$BITLOGIC(bitexpression)
Определение
bitexpression
Выражение, образованное над битовыми строками с
помошью операций И, ИЛИ, НЕ.
Функция $bitlogic() производит операции И, ИЛИ, НЕ над битовыми
строками. Строение выражения bitexpression определяется правилами:
bitexpression = bitatom [ bittail ]
bitatom = |
glvn
|
| (bitexpression) |
|
~bitatom
|
148
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
bittail = bitoper bitatom
bitoper = | & |
| | |
Здесь через glvn обозначено имя локальной или глобальной переменной.
Выражение - аргумент функции $bitlogic() вычисляется слева направо, если очередность вычисления не задана явно скобками. Приоритеты
операций И, ИЛИ, НЕ, принятые в булевой алгебре, не используются.
Оператор НЕ ( ) определен как унарный и применяется к одной битовой строке. Операторы И (&) и ИЛИ (|) определены как бинарные и
применяются к двум битовым строкам.
В качестве значений битовых строк могут быть переданы имена переменных не имеющих значения или значения пустая строка, в этом случае
считается что битовая строка состоит из нулевых битов. Результат битовой операции НЕ содержит то же самое количество битов, которое было
в аргументе. Результаты операций И и ИЛИ содержат максимальное
количество битов своих аргументов. Если один из их операндов содержит битов меньше чем другой, то битовая строка логически дополняется
нулевыми битами.
В случае если один из операндов битовой операции задан значением,
не соответствующим по своему внутреннему формату, с которым работают функции $bit, генерируется ошибка <INVALID BIT STRING>.
Примеры:
USER>s $bit(a,1)=1,$bit(a,3)=1,$bit(a,5)=1
USER>s $bit(b,2)=1,$bit(b,3)=1,$bit(b,4)=1
USER>s c=$bitlogic(~a)
USER>f i=1:1:$bitcount(c) w $bit(c,i)
01010
USER>s c=$bitlogic(a&b)
USER>f i=1:1:$bitcount(c) w $bit(c,i)
00100
USER>s c=$bitlogic(a|b)
USER>f i=1:1:$bitcount(c) w $bit(c,i)
11111
5.7. $DATA
149
5.6 $CHAR
Переводит список десятичных значений кодов ASCII в соответствующие
символы, возвращая их одной строкой.
Синтаксис
$C[HAR](Целое{,...})
Определение
Целое
Целочисленное значение, которое является десятичным значением требуемого символа ASCII в данной
позиции выходной строки.
Функция $CHAR возвращает строку символов ASCII, длина которой
равна числу неотрицательных десятичных значений, содержащихся в
функции. Если десятичное значение меньше 0 или больше 255, то функция пропустит эту позицию или вернёт в этой позиции пустую строку.
Максимальное число аргументов функции 255.
Примеры:
Команда
S X=65,Y=66,Z="GOB"
Значение функции
$C(X)="A"
$C(Y)="B"
$C(X,Y)="AB"
$C(X,Y,67)="ABC"
$C(X,-1,Y)="AB"
$C(-1)="" (пустая строка)
$C(65.7)="A" (Используется целая часть
значения)
$C($A(Z,1),$A(Z,2),$A(Z,3))="GOB"
5.7 $DATA
Возвращает индикатор, содержит ли переменная значение.
Синтаксис
$D[ATA](lvn[,glvn])
$D[ATA](gvn[,glvn])
150
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$D[ATA](ssvn[,glvn])
Определение
lvn, gvn, ssvn,
glvn
Имя локальной, глобальной или структурной системной переменной, наличие данных в которых требуется определить.
Функция $DATA() возвращает индикатор в виде числа. В результате
выполнения функция может вернуть одно из следующих значений:
0
1
10
11
TEMP>k
Переменная не имеет данных и у неё нет потомков.
Переменная имеет данные, но у неё нет потомков.
Переменная не имеет данных, но имеет потомков.
Переменная имеет данные и у неё есть потомки.
s a="",b(1)="",c="",c(1)=""
TEMP>w
a=""
b(1)=""
c=""
c(1)=""
TEMP>w $d(z),!,$d(a),!,$d(b),!,$d(c)
0
1
10
11
Имя глобальной переменной может быть задано также с использованием индикатора голой ссылки (naked indicator). Имя глобальной переменной может быть задано с явным указанием имени базы данных.
Функция $data() при обращении к глобальной переменной всегда
изменяет значение индикатора голой ссылки, даже если в этом имени
нет данных (если возвращает значения 0 или 10).
TEMP>k ^a,^b
TEMP>s ^a=1
5.7. $DATA
151
TEMP>w $d(^a),!,$zr,!,$d(^b),!,$zr
1
^a
0
^b
Применение функции $data() к структурным системным переменным
возвращает индикатор существования запрошенного объекта и в каждом
случае означает зависимую от рода этой переменной информацию.
Применение $data() к ssvn ˆ$LOCK проверяет наличие блокировки
этого имени каким-либо процессом, включая текущий.
TEMP>l
0
1
w $d(^$L("a(1)")),! l a(1) w $d(^$L("a(1)"))
Применение $data() к ssvn ˆ$JOB проверяет существование этого
процесса.
TEMP>w $d(^$J(123)),!,$d(^$J($j))
0
1
Применение функции $data() к ssvn ˆ$ROUTINE проверяет существование исходного текста этой рутины.
Применение функции $data() к ssvn ˆ$GLOBAL проверяет существование в базе данных этой глобали.
TEMP>w $d(^a)
1
TEMP>w $d(^$G("^a"))
1
Применение функции $data() к ssvn ˆ$DEVICE проверяет, открыто
ли в текущем процессе это устройство.
TEMP>w $d(^$D($io)),!,$d(^$D("fgbfdb gfbfdb fgb"))
1
0
При использовании двухаргументной формы функции $data() второй
аргумент должен быть именем локальной или глобальной переменной, и
в случае если указанная в первом аргументе переменная имеет значение,
то это значение присваивается переменной glvn.
152
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
5.8
$EXTRACT
Возвращает подстроку строки.
Синтаксис
$E[XTRACT](Строка[,Нач. позиция[,Конеч. позиция]])
Определение
Строка
Нач. позиция
Конеч. позиция
Исходная строка.
Целое число.
Целое число.
Функция выделяет из Строки подстроку символов с Начальной позиции по Конечную позицию включительно.
Дополнения:
При исходной строке, равной пустой строке, функция всегда возвращает пустую строку. Если Начальная позиция не указана, она считается
равной 1 (значение по умолчанию). Если Конечная позиция не указана, она считается равной Начальной позиции. При указании Конечной
позиции Начальная позиция должна быть указана обязательно. Если
Начальная позиция больше длины строки, функция возвращает пустую
строку. Если Начальная позиция меньше 1, функция возвращает подстроку, начиная с 1-й позиции. Если Конечная позиция больше длины
строки, функция возвращает подстроку с Начальной позиции до конца
строки. Если Конечная позиция меньше Начальной позиции, функция
возвращает пустую строку.
Примеры:
>w $e("abcd")
a
>w $e("abcd",3)
c
>w $e("abcd",3,6)
cd
5.9
$FIND
Ищет в строке подстроку и возвращает индекс символа после найденной
подстроки.
5.9. $FIND
153
Синтаксис
$F[IND](Строка,Подстрока[,Начало])
Определение
Строка
Подстрока
Начало
Значение выражения, в котором требуется вести поиск Подстроки.
Значение выражения, которое требуется найти в
Строке.
Необязательное значение, вычисляемое как целое
число, указывает, с какого символа Строки требуется вести поиск Подстроки. Если значение не указано, то принимается равным 1.
Функция $find() возвращает номер символа в Строке, следующий за
вхождением Подстроки.
TEMP>w $f("123456789",23)
4
Если Подстроки в Строке не найдено, то возвращается значение 0.
TEMP>w $f("123456","789")
0
Значение Начало используется для указания, с какого символа Строки требуется вести поиск Подстроки.
TEMP>w $f("123123","3",2)
4
TEMP>w $f("123123","3",4)
7
Таким образом, функция $find() может вернуть номер символа, который необязательно принадлежит Строке.
Если значение Строки пустая строка, то возвращается результат 0,
независимо от значения Подстроки.
TEMP>w $f("",123)
0
Если значение Подстроки пустая строка, то возвращается значение
Начало.
154
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
TEMP>w $f("123","")
1
TEMP>w $f("123","",456)
456
5.10 $FNUMBER
Возвращает значение выражения, форматированного согласно маске, заданной аргументами.
Синтаксис
$FN[UMBER](Число,Формат{,Дроб.часть})
Определение
Число
Формат
Дроб.часть
Любое числовое выражение, если не является представлением числа, то автоматически приводится к
числу.
Выражение символьного типа, которое определяет
форматирование, выполняемое для Числа.
Целочисленное выражение, которое определяет число цифр справа от десятичной точки.
Функция $FNUMBER возвращает заданное число как строку, форматированную согласно шаблону, который задаётся с помощью кодов
Формата. Коды Формата определены в следующей таблице.
Коды Формата для функции $FNUMBER
Коды
+ (плюс)
- (минус)
, (запятая)
Результат выполнения функции
Добавляет знак + ко всем положительным
значениям Числа.
Запрещает (подавляет) знак у отрицательных значений Числа, т.е. выдаёт абсолютное значение Числа.
Вставляет в форматируемое Число запятую через каждую третью позицию слева
от десятичной точки, за исключением лидирующей позиции.
5.10. $FNUMBER
. (точка)
T или t
P или p
155
Вставляет в форматируемое Число точку
через каждую третью позицию слева от
десятичной точки, за исключением лидирующей позиции и вместо десятиной точки использует запятую.
Показывает Число со знаком + или -, идущее за Числом. Если знак подавляется
(т.е. положительное число или код форматирования -), добавляется хвостовой пробел.
Представляет отрицательное значение
Числа в скобках. Если же значение Числа
положительное, то вместо скобок будут
вставлены пробелы.
Порядок, в котором заданы коды Формата, не влияют на обработку.
Если какой-либо код Формата указан более одного раза, то он будет
проигнорирован. Если Формат - пусто, будет выдано исходное значение
Числа. Если задан код Формата P вместе с кодами T, + или -, то
произойдет ошибка.
Дроб.часть отображает число позиций справа от десятичной точки.
Когда производится вычисление нового значения числа согласно Формату, то это вычисление производится с округлением и, если это требуется,
с добавлением незначащих нулей в дробной части числа.
Примеры:
Команда
SET X=3.14159
S X=1234567
Значение функции
$FNUMBER(X,"+")="+3.14159"
$FN(X,"+T")="3.14159+"
$FN(X,"+T",4)="3.1416+"
$FN(X,"T",4)="3.1416 "
$FN(X,"P",6)=" 3.141590 "
$FN(X,"P",5)=" 3.14159 "
$FN(X,"P",4)=" 3.1416 "
$FN(X,"P",3)=" 3.142 "
$FN(X,"P",2)=" 3.14 "
$FN(X,"P",1)=" 3.1 "
$FN(X,"P",0)=" 3 "
$FN(X,",",2)="1,234,567.00"
156
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
S X=-15.406
$FN(X,"T")="15.406-"
$FN(X,"T",2)="15.41-"
$FN(X,"P")="(15.406)"
$FN(X,"PT-") ошибка <FUNCTION>
5.11
$GET
Возвращает значение указанной переменной, если оно существует.
Синтаксис
$G[ET](name[,default])
Определение
name
default
Имя локальной, глобальной или структурной системной переменной, значение которой требуется вернуть.
Значение, которое возвращается в случае если в переменной не содержится данных. Если не указано,
считается равным пустой строке.
Функция $GET() в применении к локальной или глобальной переменной возвращает её значение, если оно существует. Если этой переменной
не существует, то возвращается значение default.
TEMP>k
a
1
w $g(a,"a"),!,$g(a(1),"1")
Побочным эффектом функции $get при обращении к глобальной переменной является установка значения индикатора голой ссылки (naked
indicator).
TEMP>k ^a w $g(^a,"a"),!,$zr,!,$g(^a(1),"a1"),!,$zr
a
^a
a1
^a(1)
Результат применения функции $get к структурной системной переменной определяется родом этой переменной. Для структурной переменной ˆ$LOCK возвращается значение в виде номера процесса и счётчика
5.12. $JUSTIFY
157
блокировок, который он поставил на эту переменную. Для остальных
структурных переменных генерируется ошибка чтения <SSVN VALUE>,
и чтение из них не поддерживается сервером MiniM.
TEMP>w $g(^$J($j))
<SSVN VALUE>
TEMP>w $g(^$D($io))
<SSVN VALUE>
TEMP>l a(1) w $g(^$L("a(1)"))
1520:1
5.12
$JUSTIFY
Возвращает строку, выравненную вправо до заданной ширины с заданным количеством знаков.
Синтаксис
$J[USTIFY](Строка, Ширина столбца [,Кол-во десятичных знаков])
Определение
Строка
Ширина столбца
Кол-во десятичных
знаков
Произвольная строка.
Целое число.
Целое число.
Функция служит для табличного выравнивания строк. Возвращает
строку, представляющую из себя заданную Строку, дополненную слева пробелами так, чтобы длина полученной строки была равна Ширине
столбца. При указанном Количестве десятичных знаков значение исходной Строки приводится к численному значению по правилам приведения, и её модуль округляется до требуемого количества десятичных
знаков, после чего она форматируется на указанную Ширину столбца.
Дополнения:
Если Количество десятичных знаков не указано, округление (и вообще какое-либо приведение) численных Строк не производится. Для
округления чисел до целых необходимо явно указывать Количество десятичных знаков, равное 0.
158
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Количество десятичных знаков, меньшее 0, приводит к округлению
до целого. Если при заданном Количестве десятичных знаков численное значение Строки отрицательно, то возвращается строка, включающая знак -; при положительном значении + не выводится.
При Ширине столбца, меньшей длины Строки (в т.ч. равной нулю
или меньшей), функция возвращает исходную строку, обрезание строки
не производится. Если при заданном Количестве десятичных знаков
полученная строка превышает Ширину столбца, она возвращается целиком, обрезание строки не производится.
Примеры:
>w $j("12.27qwer",12)
12.24qwer
>w $j("12.27qwer",12,1)
12.3
>w $j(-"12.27qwer",4,8)
-12.27000000
5.13
$INCREMENT
Возвращает значение локальной или глобальной переменной после приращения.
Синтаксис
$INCREMENT(name)
$INCREMENT(name,add)
Определение
name
add
Имя локальной или глобальной переменной, значение которой следует увеличить.
Если указано, то увеличить на это число. Если не
указано, то увеличить на единицу.
Функция $increment() приводит значение указанного имени name к
числу, прибавляет значение add, записывает в переменную и возвращает
полученное значение.
Если переменная не имела значения, то считается что оно было равно
0.
5.14. $LENGTH
159
Если в переменной было значение, не приводимое к числу, то считается что оно было равно 0.
Если имя name является именем глобальной переменной, то функция
выполняет увеличение особым образом - результат изменения переменной не откатывается при откате транзакции командой trollback.
В качестве значения add может быть использовано произвольное вычисляемое выражение, которое приводится к числовому виду. Полученное число может быть как целым, так и дробным, как положительным,
так и отрицательным.
Откат изменения глобальной переменной выполняется по журналу
путем последовательного просмотра сделанных в транзакции изменений
в обратном порядке. Поэтому если до выполнения функции $increment()
то же самое имя изменялось командой set, то при откате транзакции
результат функции $increment() не будет отменен, а результат команды
set будет отменен.
Примеры:
USER>k ^a s ^a=123 ts
124
123
s ^a=^a+1 w ^a,! tro
w ^a,!
USER>k ^a s ^a=123 ts
124
124
w $i(^a),! tro
USER>k ^a s ^a=123 ts
457
123
s ^a=456 w $i(^a),! tro
w ^a,!
w ^a,!
Выполнение функции $increment() выполняется атомарно, блокирование имени не требуется и наличие блокировок другими процессами
игнорируется.
5.14
$LENGTH
Возвращает длину строки в байтах или количество подстрок в строке.
Синтаксис
$L[ENGTH] (Строка, Подстрока)
160
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Определение
Строка
Подстрока
Любое строковое значение.
Любое строковое значение. Если указана, то вычисляется количество подстрок Подстрока в Строке.
Функция $LENGHT возвращает целое число, обозначающее либо
длину Строки (если параметр Подстрока не определён), либо количество вхождений в Строку, увеличенное на единицу. Если Строка
пустая, то функция выдаст 0. Если Строка определена, и её значение
равно пустой строке (""), то функция возвращает ноль.
Примеры:
Команда
SET X="ABC"
S X="123456789"
S X=""
S X="AAAA"
S X="ABCDBCABCABCD"
Значение функции
$LENGTH(X)=3
$L(X)=9
$L(X)=0
$L(X,"AA")=3
$L(X,"AB")=4
$L(X,"DC")=1
$L(X,"ABCD")=3
$L(X,"")=0
5.15 $LIST
Возвращает значение элемента списка или подсписок.
Синтаксис
$LIST(list[,pos[,end]])
$LI(list[,pos[,end]])
Определение
list
pos
end
Выражение, содержащее строку в формате списка,
возвращаемого функцией $listbuild().
Позиция, значение которой требуется вернуть, либо
позиция, начиная с которой требуется вернуть подсписок.
Позиция, по которую требуется вернуть подсписок.
5.15. $LIST
161
Функция $list() возвращает в зависимости от указанного количества
аргументов либо значение элемента списка, либо подсписок.
Если второй и третий аргументы не указаны, то функция возвращает
значение первого элемента списка.
Если указан второй аргумент и не указан третий, то функция вычисляет значение второго аргумента как число. Если значение равно -1,
то функция возвращает значение последнего, самого старшего элемента
списка. Если значение равно 0 или 1, то возвращается значение первого элемента. Если значение меньше -1, то функция генерирует ошибку
<RANGE>, означающую недопустимое задание диапазона. Иначе функция ищет и возвращает значение списка в указанной в pos позиции.
Если в указанной позиции элемент есть, но не содержит значение,
то функция генерирует ошибку <NULL VALUE>. Если в указанной позиции элемента нет (попытка взять значение после последней позиции
списка), то функция генерирует ошибку <NULL VALUE>.
Если при прохождении по списку функция обнаруживает, что строка
не содержит корректный список, то генерируется ошибка <LIST>.
Примеры:
TEMP>s list=$lb("a","b","c")
TEMP>w $li(list,-1)
c
TEMP>w $li(list,-2)
<RANGE>
TEMP>w $li(list,1)
a
TEMP>w $li(list,2)
b
TEMP>w $li(list,3)
c
TEMP>w $li(list,4)
<NULL VALUE>
TEMP>w $li(123456,3)
<LIST>
Если указаны и второй и третий аргументы списка, то функция возвращает подсписок, начиная с позиции, заданной аргументом pos, и заканчивая позицией, заданной аргументом end.
162
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Если либо pos, либо end вычисляются как отрицательные значения,
то функция $list() генерирует ошибку <RANGE>.
Если значение end вычисляется как число и меньше или равно, чем
pos, то функция возвращает подсписок из одного элемента.
Если значения позиций pos и end в отдельности или одновременно
выходят за пределы списка list, то функция не дополняет результат, и в
возвращаемом подсписке нет позиций, отсутствующих в исходном списке
list.
Примеры:
TEMP>s list=$lb("a","b","c")
TEMP>w $li(list,1,2)
??a??b
TEMP>w $li(list,2,2)
??b
TEMP>w $li(list,2,3)
??b??c
TEMP>w $li(list,2,8)
??b??c
Здесь символами ? отмечены непечатные символы разметки внутренней структуры списка.
Для функции $list() пустая строка есть список, не содержащий ни одного элемента. Одно- и двухаргументная форма $list() для такого списка
всегда генерирует ошибку <NULL VALUE>, а трёхаргументная форма
всегда возвращает пустую строку.
Функция $list() не входит в текущий ISO стандарт языка M[UMPS].
5.16
$LISTBUILD
Возвращает строку, кодированную как список значений аргументов.
Синтаксис
$LISTBUILD([item[,item...]])
$LB([item[,item...]])
Определение
item
Перечень выражений или пропуски аргументов.
5.16. $LISTBUILD
163
Функция $listbuild() возвращает строку, в которой кодирован список
значений аргументов. Количество элементов указывается количеством
аргументов. В списке элементы идут в указанном аргументами порядке.
Результат функции $listbuild() используется другими функциями группы $listXXX.
Аргументы можно опускать в произвольных позициях. В этом случае
элемент списка принимает неопределённое значение. В частности, функция $listbuild() без аргументов возвращает список из одного неопределённого аргумента.
Для функций группы $listXXX значение пустая строка является корректным списком, не содержащим ни одного элемента.
В случае если в качестве аргумента функции $listbuild() передаётся
имя локальной, глобальной или структурной системной переменной, не
имеющей значения, то в этой позиции создаётся элемент с неопределённым значением.
При возврате неопределённого значения функцией $list() генерируется ошибка <NULL VALUE>. Чтобы проверить, что элемент списка
имеет определённое значение, необходимо воспользоваться функцией
$listdata().
В качестве значения аргумента может использоваться также результат функции $listbuild(). В этом случае образуется вложение списка в
список и их внутренние структуры сохраняются.
Структура кодирования списков функцией $listbuild() такова, что
можно образовать список конкатенацией двух других функций. В этом
случае, в результате получается список, в котором сначала идут элементы первого списка, а за ними элементы второго списка.
Примеры:
TEMP>s list=$lb("a",a,)
TEMP>w $li(list,1)
a
TEMP>w $li(list,2)
<NULL VALUE>
TEMP>w $li(list,3)
<NULL VALUE>
TEMP>w $li(list,4)
<NULL VALUE>
164
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Здесь в первой позиции значение определено, во второй - не определено, потому что использовалась локальная переменная, не имеющая
значения, в третьей - не определено, потому что было указано создать
элемент с неопределённым значением, в четвёртой позиции значение не
определено, поскольку такой позиции в списке нет.
Внутреннее кодирование списков таково, что логически два одинаковых значения могут быть кодированы по-разному. Поэтому для сравнения двух списков не следует пользоваться оператором сравнения, для
этого предназначена функция $listsame().
Примеры:
TEMP>s list1=$lb(123),list2=$lb("123")
TEMP>w list1=list2
0
TEMP>w $ls(list1,list2)
1
При кодировании значений в список учитывается возможность более
компактного представления чисел. В этом случае их внутреннее побайтовое представление отличается от их побайтового строкового представления.
Функция $listbuild() не входит в текущий ISO стандарт языка M[UMPS].
5.17
$LISTDATA
Возвращает индикатор, определён ли элемент списка, сформированного
функцией $listbuild().
Синтаксис
$LISTDATA(list,[pos])
$LD(list,[pos])
Определение
list
pos
Значение выражения, содержащего список.
Выражение, задающее позицию.
Функция $listdata() проверяет, определено ли значение в элементе
списка. Значение выражения pos, если задано, вычисляется как целое
5.17. $LISTDATA
165
число. В случае если значение списка list не является корректным, генерируется ошибка <LIST>. В случае если значение pos меньше -1, генерируется ошибка <RANGE>. Для позиции -1 вычисляется, определено
ли значение последнего элемента списка. Для позиции 0 или за пределами списка возвращается значение 0. Иначе проверяется, определено
ли значение элемента списка.
Если значение pos не указано (используется одноаргументная форма),
то функция проверяет, определено ли значение первого элемента списка.
Следует обратить внимание на то, что функция проверяет не существование элемента, а имеет ли элемент значение. Элемент может иметь
неопределённое значение, например, если при создании списка функцией
$listbuild() была использована переменная с неопределённым значением
или позиция элемента была пропущена.
Примеры:
TEMP>s list=$lb("a",a,)
TEMP>w $ld(list,-3)
<RANGE>
TEMP>w $ld(list,-1)
0
TEMP>w $ld(list,0)
0
TEMP>w $ld(list,1)
1
TEMP>w $ld(list,2)
0
TEMP>w $ld(list,3)
0
TEMP>w $ld(list,4)
0
Здесь приведены различные примеры получения определённости элемента списка в зависимости от указанной позиции. При значении позиции меньше -1 (в примере -3) генерируется ошибка <RANGE>, при
позиции 0 значение не определено, для позиции 1 значение было определено, поскольку использовалось выражение, имеющее значение, для
позиции 2 значение не определено, поскольку в списке создан элемент
с неопределённым значением из-за неопределённости переменной, a третий элемент был создан неопределённым, а четвёртой позиции в списке
вообще не создавалось.
166
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Функция $listdata() не входит в текущий ISO стандарт языка M[UMPS].
5.18
$LISTFIND
Функция ищет в списке позицию с указанным значением.
Синтаксис
$LISTFIND(list,value[,startafter])
$LF(list,value[,startafter])
Определение
list
value
startafter
Значение выражения, содержащего список.
Искомое значение.
Позиция, после которой производить поиск.
Функция $listfind() возвращает позицию списка, в которой найдено
заданное значение.
Если значение найдено, возвращается номер позиции, отсчёт ведётся от единицы. Если значение не найдено, то возвращается значение
0. Если список содержит в качестве значений другие списки, то поиск
в подсписках не проводится. При поиске каждое значение вычисляется
как значение, и используются соглашения оператора равенства, поэтому
если в качестве значения используется список, то он может быть не найден. Поскольку представления списков не приводятся к каноническим.
Например:
TEMP>w $lf($lb($lb("1")),$lb(1))
0
Значение не было найдено, поскольку внутреннее представление списков $lb(1) и $lb("1") как строк различно.
Все три аргумента могут быть заданы произвольными вычисляемыми
выражениями.
Необязательный третий параметр задаёт позицию, после которой следует начать поиск. Сама указанная позиция в поиске не участвует. В
качестве позиции может быть использовано выражение, вычисляемое в
любое целое число. Задание значения, меньшее или равное нулю, задаёт
поиск, начиная с первого элемента.
При задании позиции после последнего элемента списка возвращает
значение 0.
5.19. $LISTFROMSTRING
167
Пример нахождения, в каких позициях списка находится значение a:
TEMP>s list=$lb("a","b","c","a","d")
TEMP>s p=0 f
1
4
s p=$lf(list,"a",p) q:p=0
w p,!
TEMP>
Здесь создаётся список, в который значение a входит в первой и четвертой позиции. Переменная p задаёт позицию, после которой требуется
найти значение. Используется бесконечный цикл с выходом по условию,
что функция $listfind() вернула нулевое значение. В цикле выводятся
найденные позиции.
Если при поиске в списке list функция обнаруживает нарушение формата представления списка, то она генерирует ошибку <LIST>. Например:
TEMP>w $lf(123,123)
<LIST>
Функция поиска $listfind() в элементе списка, имеющем неопределённое значение, не может найти никакое значение, включая пустую
строку.
Функция $listfind() не входит в текущий ISO стандарт языка M[UMPS].
5.19
$LISTFROMSTRING
Преобразует строку с разделителями в список.
Синтаксис
$LISTFROMSTRING(string[,delim])
$LFS(string[,delim])
Определение
string
delim
Строка с разделителями, элементы которой нужно
использовать в качестве элементов списка.
Значение строки, задающей разделитель. Если аргумент не указан, в качестве разделителя используется
символ запятая.
168
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Функция $listfromstring() преобразует строку с указанным разделителем в список. Исходная строка рассматривается как последовательность подстрок, разделенных разделителем, и эти подстроки используются для составления элементов списка.
Если получающийся список по длине выходит за пределы допустимой
длины данных, то функция генерирует ошибку <MAXSTRING>.
Примеры:
USER>s str="11,22,33"
USER>s list=$lfs(str)
USER>f i=1:1:$ll(list) w $li(list,i),!
11
22
33
USER>s str="11~22~33"
USER>s list=$lfs(str,"~")
USER>f i=1:1:$ll(list) w $li(list,i),!
11
22
33
Необходимо отметить, что, хотя функция $listfromstring() является
парной к функции $listtostring(), результат последовательного применения к списку функций $listtostring() + $listfromstring() может дать
список, бинарно не совпадающий с исходным из-за того, что внутренние
структуры списков не имеют канонического представления. При необходимости сравнивать списки нужно использовать не бинарное сравнение,
а логическое, с помощью функции $listsame().
Пример:
USER>s list1=$lb(11,22,33)
USER>s str=$lts(list1)
USER>s list2=$lfs(str)
5.20. $LISTGET
169
USER>w list1=list2
0
USER>w $listsame(list1,list2)
1
Функция $listtostring() не входит в текущий ISO стандарт языка
M[UMPS].
5.20
$LISTGET
Возвращает значение элемента списка или значение по умолчанию.
Синтаксис
$LISTGET(list[,pos[,default]])
$LG(list[,pos[,default]])
Определение
list
pos
default
Значение выражения, содержащего список.
Номер позиции элемента в списке.
Значение по умолчанию.
Функция $listget() возвращает значение элемента списка, если оно
имеет определённое значение, иначе возвращает значение, указанное как
значение по умолчанию.
Значение выражения list должно быть списком, полученным функцией $listbuild().
Значение pos если не указано, то считается, что возвращается значение позиции 1.
Если указано значение pos меньше, чем -1, то функция генерирует
ошибку <RANGE>.
Если указано значение pos, равное -1, то возвращается значение последнего элемента списка.
Если указано значение pos, равное 0 или за пределами списка list, то
считается, что такого элемента не существует, и возвращается значение
по умолчанию.
Если значение по умолчанию default не указано, то считается, что
значение по умолчанию - пустая строка.
170
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Все три аргумента могут быть заданы произвольными вычисляемыми
выражениями.
Если при работе функции $listget() обнаруживается, что в списке list
нарушена структура списка формата $listbuild(), то генерируется ошибка
<LIST>.
Примеры:
TEMP>s list=$lb("a","b","c")
TEMP>w $lg(list,-3,"def")
<RANGE>
TEMP>w $lg(list,-1,"def")
c
TEMP>w $lg(list,0,"def")
def
TEMP>w $lg(list,1,"def")
a
TEMP>w $lg(list,2,"def")
b
TEMP>w $lg(list,3,"def")
c
TEMP>w $lg(list,4,"def")
def
TEMP>w $lg(123,4,"def")
<LIST>
Функция $listget() не входит в текущий ISO стандарт языка M[UMPS].
5.21
$LISTLENGTH
Возвращает количество элементов списка.
Синтаксис
$LISTLENGTH(list)
$LL(list)
Определение
5.22. $LISTSAME
171
Значение выражения, содержащего список.
list
Функция $listlength() возвращает количество элементов списка list.
Значение выражения list должно быть получено функцией $listbuild()
или конкатенацией таких значений и соответствовать внутреннему формату списку.
Если функция обнаруживает, что значение list не является по формату корректным списком, то генерируется ошибка <LIST>.
Для пустой строки функция возвращает значение 0.
Для остальных видов списков функция возвращает количество элементов списка, включая как имеющие значения, так и имеющие неопределённые значения.
В случае если элементом списка list является, в свою очередь, список,
то такой элемент считается одним элементом, и функция $listlength() не
проводит разбор элемента.
Примеры:
TEMP>w $ll("")
0
TEMP>w $ll("1")
<LIST>
TEMP>w $ll($lb("1"))
1
TEMP>w $ll($lb("1",,))
3
Функция $listlength() не входит в текущий ISO стандарт языка M[UMPS].
5.22
$LISTSAME
Сравнивает два списка и возвращает индикатор, совпадают ли списки.
Синтаксис
$LISTSAME(list1,list2)
$LS(list1,list2)
Определение
list1,list2
Значение выражения, содержащего список.
172
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Функция $listsame() сравнивает два списка и возвращает 1, если их
элементы совпадают литерально, иначе возвращает 0. Элементы, имеющие неопределённое значение, считаются совпадающими.
Пустая строка считается списком из нуля элементов.
Функция сравнивает элементы последовательно.
Если при прохождении по спискам обнаруживается, что списки не
совпадают, то дальнейшее прохождение останавливается.
Если при прохождении по спискам обнаруживается, что по крайней
мере один из списков имеет нарушение формата представления списка,
то функция генерирует ошибку <LIST>.
Если элементом списка является список, то функция $listsame() не
проводит анализа вложенных списков и сравнивает их значения литерально.
Примеры:
TEMP>w $ls("","")
1
TEMP>w $ls("","1")
0
TEMP>w $ls("1","")
0
TEMP>w $ls($lb(1),$lb("1"))
1
TEMP>w $lb(1)=$lb("1")
0
Функция $listsame() не входит в текущий ISO стандарт языка M[UMPS].
5.23
$LISTTOSTRING
Преобразует список в строку с разделителями.
Синтаксис
$LISTTOSTRING(list[,delim])
$LTS(list[,delim])
Определение
list
Значение выражения, содержащего список, для преобразования в строку с разделителями.
5.23. $LISTTOSTRING
delim
173
Значение строки, задающей разделитель. Если аргумент не указан, в качестве разделителя используется
символ запятая.
Функция $listtostring() преобразует список в строку с указанным
разделителем. Функция преобразует только элементы указанного списка, и, если сами элементы являются списками, то они используются как
есть.
Если функция обнаруживает, что значение list не является по формату корректным списком, то генерируется ошибка <LIST>.
Если функция обнаруживает, что одно из значений списка list имеет
неопределенное значение, то генерируется ошибка <NULL VALUE>.
Примеры:
USER>w $lts($lb())
<NULL VALUE>
USER>w $lts($lb("zero","first","second"))
zero,first,second
USER>w $lts($lb("zero","first","second"),"~")
zero~first~second
USER>w $lts("ordinal string","~")
<LIST>
Необходимо отметить, что функция использует элементы исходного
списка list как есть, включая символы являющиеся заданным разделителем. Поэтому результат, в случае если элементы списка содержат
разделитель, может не соответствовать по числу разделителей числу
элементов списка.
Пример:
USER>w $lts($lb("a,b","c,d"))
a,b,c,d
Здесь использовался список из двух элементов, содержащих используемый функцией $listtostring() разделитель.
Функция $listtostring() не входит в текущий ISO стандарт языка
M[UMPS].
174
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
5.24
$LISTVALID
Проверяет, является ли значение корректной структурой списка.
Синтаксис
$LISTVALID(expr)
$LV(expr)
Определение
expr
Значение выражения, которое надо проверить.
Функция $listvalid() проверяет является ли значение, переданное в
аргументе, корректной списковой структурой. Значение выражения expr
должно быть получено функцией $listbuild() или конкатенацией таких
значений и соответствовать внутреннему формату списку.
Если функция обнаруживает, что значение expr не является по формату корректным списком, то возвращается значение 0, иначе возвращается 1.
Для пустой строки функция возвращает значение 1.
В случае если элементом списка expr является, в свою очередь, список, то такой элемент считается одним элементом, и функция $listvalid()
не проводит разбор элемента.
Примеры:
USER>w $lv("string")
0
USER>w $lv($lb())
1
USER>w $lv($lb(1,2,3))
1
USER>w $lv(123)
0
USER>
Функция $listvalid() проверяет значение на всю длину, поэтому некоторые значения могут быть использованы в списковых операциях, но
целиком списком не являться:
USER>s list=$lb(123,456,789)_"string"
5.25. $NAME
175
USER>w $li(list,2)
456
USER>w $lv(list)
0
Функция $listvalid() не входит в текущий ISO стандарт языка M[UMPS].
5.25
$NAME
Возвращает строковое представление имени локальной, глобальной или
структурной системной переменной.
Синтаксис
$NA[ME](Переменная[,Уровень индекса])
Определение
Переменная
Уровень индекса
Произвольная (в т.ч. неопределённая) локальная или глобальная переменная.
Целочисленный положительный уровень
индекса для индексированных переменных.
Функция возвращает имя указанной Переменной в виде строки с
указанием всех заданных индексов. Уровень индекса ограничивает количество выводимых индексов в имени. Имя выводится в канонической
(полностью развёрнутой) форме.
Дополнения.
Проверка на определённость переменной и существование неймспейса для глобальных переменных (если указан) не производится. Для глобальных переменных Переменная может быть указана в виде индикатора неполной ссылки. В этом случае результат выводится в канонической форме.
Если Уровень индекса отсутствует, возвращается имя переменной со
всеми указанными индексами.
Если Уровень индекса равен 0 или любой нечисленной строке (в т.ч.
пустой строке), возвращается имя переменной без индексов. Задание
Уровня индекса меньше 0 приводит к ошибке.
176
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Если Уровень индекса больше количества индексов в заданной Переменной, возвращается имя переменной со всеми индексами.
Примеры:
>s ^A(1,2,3)=1
>w $na(^A(1,2,3))
^A(1,2,3)
>w $na(^A(1,2,3),1)
^A(1)
>w $na(^(2,9,10))
^A(1,2,2,9,10)
TEMP>w $na(^A(1,2,3),2)
^A(1,2)
TEMP>w $na(^A(1,2,3),0)
^A
TEMP>w $na(^A(1,2,3),-1)
<FUNCTION>
Примечание: глобальная переменная ˆA(2,9,10) не определена.
5.26
$ORDER
Возвращает следующий индекс в переменной.
Синтаксис
$O[RDER](name[,direction])
Определение
name
direction
Имя локальной, глобальной или структурной системной переменной.
Вычисляемое значение, определяет направление получения индекса: по убыванию или по возрастанию.
Функция $order() в применении к локальной или глобальной переменной возвращает значение следующего, в смысле индексной сортировки индекса этой переменной.
TEMP>s a(12)=12,a(45)=45,a("ab")="ab",a("cd")="cd"
5.26. $ORDER
177
TEMP>w $o(a(1))
12
TEMP>w $o(a(100))
ab
TEMP>w $o(a("bb"))
cd
TEMP>w $o(a("zz"),-1)
cd
TEMP>w $o(a("bb"),-1)
ab
TEMP>w $o(a("100"),-1)
45
TEMP>w $o(a("20"),-1)
12
Если последний индекс в имени переменной равен пустой строке, то
при перечислении по возрастанию функция возвращает самое младшее
значение, а при перечислении по убыванию - самое младшее значение.
TEMP>w $o(a(""),-1)
cd
TEMP>w $o(a(""))
12
Если при перечислении как по возрастанию, так и по убыванию далее
индексов нет, то функция возвращает пустую строку.
Параметр direction может либо отсутствовать, либо принимать значения 1 или -1. Иные значения зарезервированы стандартом для будущего использования, и их использование приводит к генерации ошибки
<FUNCTION>. Значения direction определяют действия:
1
-1
не указано
Вернуть следующее значение индекса по возрастанию.
Вернуть следующее значение индекса по убыванию.
Эквивалентно значению 1.
Применение функции $order() к имени глобальной переменной без
указания индекса недопустимо и приводит к генерации ошибки <FUNCTION>.
Применение функции $order() к имени локальной переменной без
178
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
указания индекса возвращает следующее имя локальной переменной без
индекса. Это позволяет перечислить имена локальных переменных. При
этом первой имя должно быть допустимым именем локальной переменной, но не обязано существовать. Например:
TEMP>s a="a",b="b",c="c"
TEMP>s %="%" f
a=a
b=b
c=c
TEMP>s %="zzz" f
c=c
b=b
a=a
%=%
s %=$o(@%) q:%=""
w %,"=",@%,!
s %=$o(@%,-1) q:%=""
w %,"=",@%,!
Побочным результатом выполнения функции $order является изменение индикатора голой ссылки (naked indicator) при обращении к глобальной переменной. Если следующий индекс переменной существует,
то индикатор голой ссылки ссылается на полное имя с этим индексом.
Если следующего индекса не существует (функция возвращает пустую
строку), то индикатор голой ссылки принимает значение исходной глобальной переменной, переданной в функцию $order.
TEMP>k ^a w $o(^a("")),!,$zr
^a("")
TEMP>s ^a(1)=1 w $o(^a("")),!,$zr
1
^a(1)
TEMP>w $o(^a(1)),!,$zr
^a(1)
При обращении к глобальной переменной, если явно была указана база данных этой переменной, то в индикатор голой ссылки (naked
indicator) пишется также полное имя, включая имя базы данных.
TEMP>w $o(^|"TEMP"|a(1)),!,$zr
^|"TEMP"|a(1)
5.27. $PIECE
179
Применение функции $order() к структурной системной переменной
возвращает значение в зависимости от рода этой системной переменной.
$order(ˆ$LOCK(name)[,direction]) перечисляет имена блокированных
каким-либо процессом имён.
$order(ˆ$ROUTINE(name)[,direction]) перечисляет имена имеющихся
в системе рутин.
$order(ˆ$DEVICE(name)[,direction]) перечисляет имена открытых текущим процессом устройств ввода-вывода.
$order(ˆ$GLOBAL(name)[,direction]) перечисляет имена глобалов, созданных в текущей базе данных.
$order(ˆ$JOB(job)[,direction]) перечисляет номера процессов MiniM,
работающих на сервере.
5.27
$PIECE
Возвращает подстроку, выделенную из строки через строку-разделитель.
Синтаксис
$P[IECE](Строка,Разделитель[,Нач. позиция[,Конеч. позиция]])
Определение
Строка
Разделитель
Начальная позиция
Конечная позиция
Иходная строка.
Строка (символ).
Целое число.
Целое число.
Функция выделяет из Строки подстроку, ограниченную Разделителем, т.е. другой указанной подстрокой (в т.ч. отдельным символом).
Предполагается, что исходная строка состоит из нескольких частей,
между которыми вставлена строка-Разделитель (количество таких подстрок может быть определено функцией $length (строка,разделитель)).
Начальная позиция определяет, какая по порядку часть исходной
строки с правой границей-Разделителем будет возвращена. Конечная
позиция указывается для выделения нескольких таких частей, начиная
с Начальной позиции. При этом, в возвращаемую строку, включаются
разделённые подстроки с начальной по конечную позиции включительно,
вместе с разделителями.
Дополнения.
180
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
При исходной строке, равной пустой строке, функция всегда возвращает пустую строку. При Разделителе, равном пустой строке (""),
функция всегда возвращает пустую строку.
Если Начальная позиция не указана, она считается равной 1 (значение по умолчанию).
Если Конечная позиция не указана, она считается равной начальной
позиции. При указании Конечной позиции Начальная позиция должна
быть указана обязательно.
Если Начальная позиция больше количества разделённых подстрок
в строке, функция возвращает пустую строку. Если Начальная позиция
меньше 1, функция возвращает подстроку, начиная с 1-й позиции.
Если Конечная позиция больше количества разделённых подстрок в
строке, функция возвращает подстроку с Начальной позиции до конца
строки. Если Конечная позиция меньше начальной позиции, функция
возвращает пустую строку.
Если исходная строка начинается разделителем, то первая подстрока
считается пустой. Если исходная строка завершается разделителем, то
последняя подстрока считается пустой.
Примеры:
>w $piece("a^b^c","^")
a
>w $p("a^b^c","^",2)
b
>w $p("a^b^c","^",2,3)
b^c
5.28
$QLENGTH
Возвращает количество индексов в имени индексированной переменной.
Синтаксис
$QL[ENGTH](name)
Определение
name
Выражение, содержащее имя локальной, глобальной
или структурной системной переменной, индексированной или нет.
5.28. $QLENGTH
181
Функция $qlength возвращает количество индексов в имени индексированной переменной. Если у имени переменной нет индексов, то возвращается значение 0.
Примеры:
TEMP>w $ql("a")
0
TEMP>w $ql("a(1)")
1
TEMP>w $ql("a(1,1)")
2
TEMP>w $ql("a(1,1,1)")
3
Имя глобальной переменной может задаваться как с указанием базы
данных, так и без них, указание базы данных не влияет на результат
функции $qlength.
TEMP>w $ql("^a(1,1,1,1)")
4
TEMP>w $ql("^|""abc""|a(1,1,1,1)")
4
Имя базы данных должно указываться в двойных кавычках. Если в
качестве имени базы данных указано недопустимое имя или имя указано не в двойных кавычках, то функция $qlength генерирует ошибку
<FUNCTION>.
TEMP>w $ql("^|""123""|a(1,1,1)")
<FUNCTION>
TEMP>w $ql("^|abc|a(1,1,1)")
<FUNCTION>
Для структурной системной переменной имя системной переменной
не проверяется.
TEMP>w $ql("^$lll(1,1,1,1)")
4
TEMP>w $ql("^$abcd(1,1,1,1)")
4
182
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
При проверке количества индексов в имени переменной существование самого имени не требуется и не проверяется. Если в имени указано
больше максимального количества индексов (63), то функция генерирует
ошибку <FUNCTION>.
5.29 $QSUBSCRIPT
Возвращает части имени переменной, имя базы данных, имя индексов
или значения индексов.
Синтаксис
$QS[UBSCRIPT](namevalue,position)
Определение
namevalue
position
Значение выражения, содержащее имя переменной.
Номер индекса или части имени.
Функция $qsubscript() возвращает части имени переменной, имя базы данных, имя или значения индексов из полного имени, заданного в
аргументе namevalue. Имя не проверяется на существование. Часть полного имени указывается аргументом position. Его допустимые значения:
< -1
-1
0
<= n
>n
Функция генерирует ошибку <FUNCTION>, значения меньшие, чем -1 зарезервированы стандартом для
будущего применения.
Функция возвращает имя базы данных, если оно указано как часть глобального имени, иначе функция
возвращает пустую строку.
Функция возвращает имя переменной.
Если position от 1 до n, где n - количество индексов,
то возвращается значение индекса.
Если position больше числа индексов, то возвращается пустая строка.
Примеры:
TEMP>w $qs("^|""abc""|aaa(1,2,3)",-2)
<FUNCTION>
5.30. $QUERY
183
TEMP>w $qs("^|""abc""|aaa(1,2,3)",-1)
abc
TEMP>w $qs("^|""abc""|aaa(1,2,3)",0)
^aaa
TEMP>w $qs("^|""abc""|aaa(1,2,3)",1)
1
TEMP>w $qs("^|""abc""|aaa(1,2,3)",2)
2
TEMP>w $qs("^|""abc""|aaa(1,2,3)",3)
3
TEMP>w $qs("^|""abc""|aaa(1,2,3)",4)
TEMP>w $qs("^$aaa",0)
^$aaa
Имя базы данных может указываться в обоих вариантах как с разделителями || (вертикальные черты), так и с разделителями [] (квадратные
скобки).
Для имени структурной системной переменной (начинается на символы ˆ$) допустимость имени не проверяется.
Если задан параметр position больше, чем максимально допустимое
число индексов (63), то функция генерирует ошибку <FUNCTION>. Если имя базы данных указано не в двойных кавычках либо является
недопустимым именем, то функция генерирует ошибку <FUNCTION>.
TEMP>w $qs("^[abc]aaa(1,2,3)",0)
<FUNCTION>
USER>w $qs("^[""abc""]aaa(1,2,3)",0)
^aaa
5.30
$QUERY
Возвращает имя следующего узла индексированной переменной.
Синтаксис
$Q[UERY](name[,direction])
Определение
184
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
name
direction
Имя локальной, глобальной или структурной системной переменной, индексированной или нет.
Направление перечисления следующего узла переменной, по возрастанию или по убыванию.
Функция $query возвращает имя следующего узла индексированной
переменной.
Примеры:
TEMP>s ^a(1)=1,^a(2,2)=22,^a(3,3,3)=333
TEMP>zw ^a
^a(1)=1
^a(2,2)=22
^a(3,3,3)=333
TEMP>w $q(^a(1))
^a(2,2)
TEMP>w $q(^a(2))
^a(2,2)
TEMP>w $q(^a(3))
^a(3,3,3)
TEMP>w $q(^a(5),-1)
^a(4)
TEMP>w $q(^a(4),-1)
^a(3,3,3)
TEMP>w $q(^a(3),-1)
^a(2,2)
TEMP>w $q(^a(2),-1)
^a(1)
Параметр direction задаёт направление перечисления. Допустимые
значения:
-1
1
не указано
иное
Вернуть следующее имя по убыванию.
Вернуть следующее имя по возрастанию.
Эквивалентно заданию значения 1.
Функция генерирует ошибку <FUNCTION>, значение зарезервировано стандартом для будущего использования.
5.30. $QUERY
185
Если последний индекс в имени name равен пустой строке, то функция выдаёт следующий крайний узел этой переменной, в зависимости от
направления direction младший или старший.
TEMP>w $q(^a(""))
^a(1)
TEMP>w $q(^a(""),-1)
^a(4)
Если далее при перечислении узлов не обнаружено, то функция возвращает пустую строку. Например:
TEMP>w $q(^a(5))
TEMP>w $q(^a(1),-1)
TEMP>
Если в имени name было полностью указано имя глобальной переменной вместе с именем базы данных, то функция $query также возвращает
полное имя с именем базы. Если в качестве имени базы данных указана
пустая строка, то она считается эквивалентом текущей базы данных.
TEMP>w $q(^a(1))
^a(2,2)
TEMP>w $q(^|""|a(1))
^|""|a(2,2)
TEMP>w $q(^|"TEMP"|a(1))
^|"TEMP"|a(2,2)
Функция $query всегда проверяет существование узла переменной и
возвращает только существующие узлы, имеющие значения (для которых функция $data() возвращает либо 1, либо 11).
Побочным эффектом функции $query является изменение индикатора голой ссылки (naked reference) при задании в name имени глобальной
переменной. Если следующее значение существует, то голая ссылка принимает это значение, иначе голая ссылка принимает значение name.
Примеры:
TEMP>w "next=",$q(^a(1)),!,"naked=",$zr
next=^a(2,2)
naked=^a(2,2)
TEMP>w "next=",$q(^a(5)),!,"naked=",$zr
next=
naked=^a(5)
186
5.31
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$RANDOM
Выдаёт псевдослучайные числа в заданном интервале.
Синтаксис
$R[ANDOM](Целое)
Определение
Целочисленное выражение - интервал, из которого
будут выданы псевдослучайные числа.
Целое
Функция $random выдаёт псевдослучайные целочисленные значения,
которые больше или равны нулю и меньше, чем значение аргумента
Целое. Если значение Целого равно 1, функция выдаст 0. Если значение
Целого меньше 1, то произойдет ошибка.
Примеры:
Команда
SET X=$RANDOM(25)
SET X=$R(2)
SET X=$R(1)
SET X=$R(-1)
Значение функции
Значение X будет выбираться из промежутка от 0 до 24.
Значение X может быть либо 0, либо 1.
Значение переменной X всегда будет 0.
Произойдет ошибка.
5.32 $REPLACE
Заменяет в строке одну подстроку на другую.
Синтаксис
$REPLACE(string,old,new[,start[,count[,case]]])
Определение
string
old
new
start
count
Исходная строка, в которой требуется найти подстроки
Искомая подстрока, которую требуется заменить
Подстрока, на которую требуется заменить old
Необязательный параметр, позиция символа с которого надо
выполнять поиск с заменой
Необязательный параметр, количество выполняемых замен
5.32. $REPLACE
case
187
Необязательный параметр, задает регистрочувствительность
для поиска old
Функция $replace возвращает строку на основе строки string, в которой заменены вхождения old на new в соответствии с указанными
параметрами.
Если строка string пустая, то функция ничего не делает и возвращает
пустую строку.
Если значение old вычислено как пустая строка, то функция ничего
не делает и возвращает значение string.
Если значение new вычислено как пустая строка, то функция возвращает значение string с удаленными вхождениями подстроки old в
соответствии с заданными параметрами.
Если значение start указано, то оно означает позицию в строке string,
с которой следует вполнять поиск с заменой. Любое значение вычисленное как ноль или отрицательное число означает поиск с первого символа.
Если значение start вычислено как число большее чем длина строки, что
возвращается пустая строка. Если значение start не указано, выполняются все замены начиная с первого символа строки string.
Если указано значение count, то оно вычисляется как число и означает количество вхождений подстроки old, которые требуется заменить.
Если указано значение -1, то это означает использовать все вхождения
найденные после позиции start. Если указано значение 0 или любое
другое отрицательное кроме -1, функция не выполняет замен и возвращает значение string. Если значение count не указано, выполняются все
замены начиная с позиции start.
Если указано значение case, то оно рассматривается как указание
регистрозависимости. Если значение не указано или вычисляется как
число 0, то выполняется регистрозависимый поиск, если указано и вычисляется как не ноль, выполняется регистронезависимый поиск.
Примеры:
USER>w $replace("qqwweerr","w","AA")
qqAAAAeerr
USER>w $replace("qqwweerr","ww","AA")
qqAAeerr
USER>w $replace("qqwweerr","www","AA")
qqwweerr
188
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
USER>w $replace("qqwweerr","w","AA",3)
qqAAAAeerr
USER>w $replace("qqwweerr","w","AA",4)
qqwAAeerr
USER>w $replace("qqwweerr","w","AA",3,1)
qqAAweerr
USER>w $replace("qqwWeerr","w","AA",1,-1,0)
qqAAWeerr
USER>w $replace("qqwWeerr","w","AA",1,-1,1)
qqAAAAeerr
5.33
$REVERSE
Возвращает строковое представление аргумента с обратным порядком
следования байт.
Синтаксис
$RE[VERSE](Строка)
Определение
Строка
Значения, байты которого будут использованы для
перестановки.
Функция $reverse возвращает строку с порядком следования символов, обратным заданной Строке.
Примеры:
Команда
SET X="ABCDEF"
SET X=""
SET X=2*64
Значение функции
$REVERSE(X)="FEDCBA"
$RE(X)=""
$RE(X)=821
5.34 $SELECT
Возвращает значение, вычисленное в зависимости от указанной серии
условий.
Синтаксис
5.35. $STACK
189
$S[ELECT](Выражение:Значение[,Выражение:Значение[,...]])
Определение
Выражение
Значение
Логическое выражение.
Возвращаемое значение (строка).
Функция возвращает первое по списку Значение, для которого Выражение имеет значение ИСТИНА по правилам языка (так, произвольная строка данных, не являющаяся логическим выражением, в данном
случае приводится к численному виду и считается истиной, если она
отлична от 0).
Дополнения.
Количество пар Выражение:Значение может быть произвольным. Истинность Выражений оценивается справа налево, после достижения истинного Выражения дальнейшая обработка прекращается. Хотя бы одно
из Выражений в списке должно быть истинным, в противном случае
выполнение вызывает ошибку.
Примечание: для исключения подобных ситуаций возможно применение
как последней альтернативы заведомо верного выражения (1). Например:
$s(a<0:1,a>0:-1,1:0)
Примеры:
>s a=-123
>w $s(a<0:1,a>0:-1,1:0)
-1
>s b=$s(a<0:"one^Rout",a>0:"two^Rout",1: "three^Rout")
>d @b
5.35
$STACK
Возвращает информацию об уровнях стека текущего процесса.
Синтаксис
$ST[ACK](level[,context])
Определение
190
level
context
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Значение с номером уровня стека.
Параметр контекста.
Функция возвращает информацию об уровнях стека текущего процесса. Уровень стека задаётся параметром level. Значение level может
принимать значения от 0 (начальный уровень стека) до значения, возвращаемого системной переменной $stack включительно.
Для одноаргументной формы функции $stack возвращаются значения: если была ошибка выполнения, то возвращается строка с ошибкой
выполнения, иначе возвращается одна из строк:
DO
XECUTE
$$
Если текущий контекст образован выполнением команды do с параметрами или без них.
Если текущий контекст образован выполнением команды xecute.
Если текущий контекст образован вызовом подпрограммы с возвращаемым значением.
Для одноаргументной формы $STACK() зарезервированы 2 специальных значения
-1
0
Возвращается число уровней стека, доступные для
анализа.
Возвращается кроме режима выполнения нулевого
уровня стека также способ старта процесса.
Способ старта процесса указывается через запятую после контекста
выполнения:
XECUTE,CONSOLE
При старте процесса в виде консоли.
XECUTE,TELNETПри старте процесса для обслуживания телнетсоединения.
XECUTE,STD
При старте процесса с перенаправлением вводавывода.
XECUTE,JOB
При старте фонового процесса.
XECUTE,JOBTCPПри старте фонового процесса с передачей TCP/IP
сокета.
QUIT,MONO
При вычислении выражения в контексте MiniMono.
XECUTE,MONO При выполнении строки команд в контексте
MiniMono.
5.36. $TEXT
191
XECUTE,UNKNOWN
Процесс в состоянии выполнения строки команд, но
способ старта не определен.
Для двухаргументной формы функции $stack допускается одно из
следующих значений параметра context:
PLACE
Возвращается место программы, которое исполняет
строку на указанном уровне исполнения программы.
Возвращается строка программы, которая исполняется на указанном уровне исполнения.
Возвращается строка с ошибкой, если на этом уровне
стека произошла ошибка.
MCODE
ECODE
Если на запрошенном уровне стека исполняется команда xecute, то
при задании параметра context = "PLACE" функция возвращает строку
из одного символа @.
В случае если исполняется строка без метки, то при параметре context
= "PLACE" функция формирует возврат как метка + смещение + имя рутины. Метка и смещение отсчитываются от последней пройденной процессом метки при выполнении программы.
Использование функции $stack разрешено везде и в любом контексте
исполняемого процесса. При задании уровней стека меньше -1 функция
генерирует ошибку <FUNCTION>. При задании уровней стека больше,
чем значение возвращаемое $stack(-1) (число доступных для анализа
уровней), возвращается пустая строка.
Значения, возвращаемые функцией $stack(), могут быть недоступны
при исчерпании стековой памяти возвращаемых значений, в этом случае
генерируется ошибка <STRINGSTACK>.
Функция $STACK() удерживает информацию об уровнях стека при
происхождении ошибки до присваивания
set $ecode=""
после чего возвращает информацию о реальном состоянии стека процесса.
5.36
$TEXT
Возвращает строку программы в заданной рутине с заданного места.
Синтаксис
192
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$T[EXT]([Метка][+Смещение][ˆПрограмма])
либо
$T[EXT](@[Выражение])
Определение
Метка
Смещение
Программа
Выражение
Имя метки (в т.ч. подпрограммы, функции) в рутине.
Смещение в строках относительно метки.
Имя рутины.
Текстовая строка, содержащая параметры Метка,
Смещение и Программа, в необходимом сочетании.
Данный способ вызова является косвенным обращением.
Функция возвращает строку, содержащую линию исходного кода программы. В случае если исходный код не представлен, функция ищет
строку в компилированном байт-коде. Строка в байт-коде присутствует,
если начинается с двойного комментария (;;). Местоположение возвращаемой линии определяется параметрами, т.е. возвращается линия кода,
имеющая заданное Смещение (численное, в количестве строк) относительно Метки в Рутине. Смещение должно быть выражением, приводимым к неотрицательному целому числу.
Примечание: при первой форме вызова обязательно наличие хотя бы
одного параметра! Вторая форма вызова должна содержать строку, корректно описывающую первую форму вызова.
Дополнения.
Исходный код выводится по имеющемуся в системе исходному коду
(рутинам). В случае отсутствия рутин с исходным кодом (при наличии
исполняемого байт-кода) функция, в общем случае, вернёт пустую строку.
Если строка в исходном коде содержит двойной комментарий (;;), то
функция вернёт эту строку исходного кода.
Если указана только Программа, то возвращается первая строка этой
программы.
Если указано Смещение, но не указана Метка, то Смещение отсчитывается относительно начала Рутины.
Если указана Рутина и Смещение, равное 0, то функция возвращает
имя рутины.
Если Cмещение не указано, то возвращается строка, содержащая
Метку.
5.37. $TRANSLATE
193
Если не указана Рутина, то она принимается текущей (т.е. исполняемой в данное время).
Если комбинация из заданных параметров не встречается в исходном коде, функция возвращает пустую строку. Возвращаемая строка не
содержит символа возврата каретки.
Примеры:
=TstRout - исходная рутина=======
a(num)
n a,b,c
s a=1
s b=2
s c=3
w "current routine offset "num," line is ",$t(+num),!
w "current routine label offset ",num," line is ",$t(a+num),!
=========
>w $t(^TstRout)
a(num)
>w $t(+2^TstRout)
n a,b,c
>d a^TstRout(4)
current routine offset 4 line is s b=2
current routine label offset 4 line is s c=3
>s param="a+2^TstRout"
>w $t(@param)
s a=1
5.37
$TRANSLATE
Выдаёт строку, которая была оттранслирована, согласно определённой
маске.
Синтаксис
$TR[ANSLATE](Строка,Стар{,Нов})
Определение
Строка
Стар
Нов
Любое строковое выражение.
Выражение, задающее замещаемые символы.
Выражение, задающее замещающие символы.
194
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Функция $translate рассматривает каждый символ в Строке слева
направо и заменяет каждое его вхождение в Строку на новый символ.
Первый символ из Стар заменяется на первый символ из Нов, второй на второй, и т.д. Если длина Стар больше длины Нов, символы из Стар,
которым нет соответствия в Нов, заменяются на пустую строку "" или
удаляются. Если Нов не задано, то каждый символ Стар переводится
в пустую строку "". Если длина Нов больше длины Стар, то лишние
символы в строке Нов игнорируются.
Примеры:
Команда
Значение функции
$TR("ABCD","A","X") "XBCD", символ A заменен на X
$TR("ABCD","AB","X") "XCD", замена символа A на X и B на
пусто
$TR("ABCD","AB","ab") "abCD"
$TR("12-34-56","-") "123456", удаление символа "-"
5.38 $VIEW
5.38.1
$VIEW("db")
Если первый параметр функции $view равен "db" без учёта регистра,
то эти функции создают, удаляют, добавляют к файлу данных блоки
страниц. При явном задании количества добавляемых блоков страниц
проверка на превышение установленных в конфигурации размеров не
производится.
$view("db",1,filename,pageblocks)
Создать новый корневой файл данных с именем filename и pageblocks
блоков страниц. Один блок страниц - 1 мегабайт.
$view("db",2,dbname[,pageblocks])
Добавить к базе данных dbname указанное число блоков страниц
pageblocks. Если число pageblocks не указано, то добавляется один блок.
Один блок страниц - 1 мегабайт. Если на базу установлено ограничение
роста, то добавление не превысит заданного ограничения. Если не существует такой базы данных или база данных не отмечена как используемая (Mount = 0) или если база данных только на чтение то функция
генерирует ошибку <FUNCTION>.
$view("db",3,filename,pageblocks)
5.38. $VIEW
195
Добавить к файлу данных с именем filename pageblocks блоков страниц. Один блок страниц - 1 мегабайт.
$view("db",4,filename)
Получить количество блоков страниц, находящихся в этом файле
данных.
$view("db",5,nspace,nblock)
Прочитать и вернуть значение блока.
$view("db",6,nspace,nblock,value)
Записать значение блока.
$view("db",7,nspace,nblock)
Поставить блокировку блока на чтение.
$view("db",8,nspace,nblock)
Поставить блокировку блока на запись.
$view("db",9,nspace,nblock)
Снять блокировку блока на чтение.
$view("db",10,nspace,nblock)
Снять блокировку на блок на запись.
$view("db",11,nspace,nblock,locktype)
Заменить блокировку блока на указанную: 0 - на чтение, 1 - на запись.
$view("db",12,nspace,blocktype)
Запросить новый блок для указанного типа блока.
$view("db",13,nspace,nblock)
Освободить блок.
$view("db",14)
Снять все блокировки страниц текущего процесса.
$view("db",15)
Получить список смонтированных баз данных через разделитель *.
$view("db",15,dbname)
Проверить существование указанной базы данных, вернуть 1, если
существует, и 0, если нет.
196
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$view("db",16,options,filename)
Выполнить бекап всех смонтированных баз данных.
$view("db",16,options,filename,dblist)
Выполнить бекап баз данных, указанных через запятую в значении
dblist.
Значения опций бекапа, указываемые в options задаются символами.
Если символ присутствует, то он указывает на использование опции.
F или f
D или d
T или t
R или r
Выполнить полный бекап
Выполнить дифференциальный бекап
Выполнить усечение файла журнала после бекапа
Выводить подробный отчет
Если не указана опция T то усечение журнала не выполняется.
Если не указана ни опция F ни опция D то выполняется полный
бекап.
Нельзя указывать одновременно опции F и D.
Значение filename задает имя файла для бекапа. Если промежуточные
каталоги не существовали, то они автоматически создаются.
При успешности выполнения бекапа функция возвращает пустую
строку. Иначе возвращается число, код ошибки.
1
2
3
4
5
6
7
8
9
Нельзя указывать опции F и D одновременно.
Указана неподдерживаемая опция бекапа.
Для имени файла бекапа указано слишком длинное
имя.
Для имени файла бекапа указано пустая строка.
Имя файла бекапа содержит недопустимые символы.
Одна из указанных баз данных в списке dblist не
является смонтированной.
Одна из указанных баз данных с списке dblist является автосоздаваемой, для таких операция бекапа не
поддерживается.
Одна из указанных в списке dblist баз данных не
существует в текущей конфигурации.
Для бекапа не нашлось ни одной подходящей базы
данных.
5.38. $VIEW
10
11
12
13
197
Не удалось автоматически создать промежуточные
каталоги для файла filename.
Не удалось открыть файл filename на запись для выполнения бекапа.
Операция бекапа не может быть произведена из-за
внутреннего сбоя компрессора данных.
Запись очередной страницы данных невозможна.
В случае если указана опция усечения журнала но при этом на сервере работает по крайней мере один процесс в состоянии транзакции,
операция усечения игнорируется и функция $v("db",16) возвращает в
качестве кода ошибки пустую строку, после которой после запятой указывается предупреждение о количестве работающих в транзакии процессов.
$view("db",17,filename)
Функция возвращает заголовок файла filename считая что это файл
бекапа. Возвращаемое значение имеет формат
Число , Текстовое содержание
Если Число не равно нулю, то значит произошла одна из ошибок и в
Текстовое содержание помещается текст об ошибке. Если Число равно
0, то далее следует перечисление через запятую полей заголовка файла
бекапа:
Строка "MiniM backup file", указывающая на то, что это файл бекапа
MiniM.
Строка "FULL" если файл полного бекапа или "DIFF" если дифференциального бекапа.
Число, внутренний номер транзакций (синтетический).
Число, количество баз данных в этом бекапе.
Дата бекапа в формате dd.mm.yyyy.
$view("db",18,filename)
Функция возвращает список имен баз данных через запятую, которые были сохранены в этом бекап-файле. Если результат начинается на
число, то после него следует запятая и сообщение об ошибке.
$view("db",19,options,filename)
198
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Выполнить восстановление базы данных из файла бекапа.
Значения опций восстановления задаются как символы в значении
options. Если символ присутствует, то он указывает на использование
опции.
J или j
S или s
F или f
D или d
R или r
Выполнить накат журнала после восстановления из
бекапа
Не выполнять никакие операции с журналом
Проверить, что это файл полного бекапа
Проверить, что это файл дифференциального бекапа
Выводить подробный отчет
Имя файла бекапа для восстановления указывается в значении параметра filename.
При успешности выполнения бекапа функция возвращает пустую
строку. Иначе возвращается число, код ошибки.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Указаны взаимоисключающие опции восстановления.
Указана неподдерживаемая опция восстановления.
Указано недопустимое имя файла.
Ошибка открытия файла бекапа.
Файл не является файлом бекапа.
Ошибка чтения из файла бекапа.
Не совпадает контрольная сумма бекап файла.
Файл не является файлом полного бекапа.
Файл не является файлом дифференциального бекапа.
На сервере присутствуют процессы работающие в
транзакции.
База данных, указанная в бекапе, отсутствует на сервере.
База данных, указанная в бекапе, на сервере не
смонтирована.
База данных, указанная в бекапе, находится в состоянии только чтение.
Ошибка доступа к файлу журнала.
Не найден последний журнал.
В журнале не найдена точка восстановления.
Ошибка чтения из файла журнала.
5.38. $VIEW
18
19
20
199
Сбой доступа к базе данных при применении журнальной записи.
Сбой при записи в файл журнала.
Сбой при расширении одной из баз данных.
На сервере только один процесс может запустить функцию восстановления баз данных из бекапа. Эта возможность функцией не проверяется, поскольку при восстановлении из бекапа выполняется приостанов
работы иных процессов и считается что восстановление из бекапа выполняется только по инициативе одного оператора.
При восстановлении из файла бекапа функции требуется на время
приостанавливать работу остальных процессов. Для этого при выполнении соответствующей фазы восстановления выполняется запрет на
запуск новых процессов на сервере и уже запущенные процессы останавливаются. По окончании восстановления баз данных остановленные
процессы снова стартуют в нормальном режиме и выполняется разрешение на запуск новых процессов. Восстановление из бекапа требует,
чтобы на сервере не было активных процессов в состоянии транзакции.
В этом случае функция восстановления заканчивает работу с возвратом
ошибки.
При указании опции "R" выполняется вывод поясняющих сообщений
что именно выполняется в текущее устройство вывода.
При указании опции наката по журналу "J" после восстановления
блоков баз данных производится поиск в журнале контрольной точки
бекапа и выполняется применение записанных в журнале действий к
базе данных. Выполнение действий производится ко всем базам данных, которые перечислены в файле бекапа. В случае если процессы не
использовали журналирование или база данных была использована в
нежурналируемом режиме, то в журнале не будет записей по изменению
базы данных, это следует учитывать.
В случае, если не было указано опции "J" и опции "S", выполняется восстановление блоков, после чего производится откат по журналу
неподтвержденных до контрольной точки восстановления транзакций.
В случае указания опции "S" выполняется пропуск фазы операций
с журналом, выполняется только восстановление блоков базы данных.
Этот режим используется в случае, если требуется восстановить базу
данных из последовательно нескольких файлов дифференциального бекапа с тем, чтобы сохранить очередность изменений баз.
200
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Оператор восстановления базы данных должен правильно понимать
схему работы функции восстановления баз и правила поддержания отказоустойчивости сервера. Эти материалы описаны отдельно в документе
"Расширенное руководство по MiniM".
$view("db",20,dbname,nblock)
Проверить контрольную сумму блока номер nblock для базы данных
dbname. Если такой базы данных не существует, то генерируется ошибка
<FUNCTION>. Если задан отрицательный номер блока, то генерируется
ошибка <FUNCTION>. Если контрольная сумма блока корректна, то
возвращается 1, иначе возвращается 0.
$view("db",21,dbname)
Проверить контрольную сумму всех блоков базы данных dbname. Если такой базы данных не существует, то генерируется ошибка <FUNCTION>.
Если найден по крайней мере один блок с некорректной контрольной
суммой, то возвращается 0, если все блоки корректны, то возвращается 1. Функция последовательно проверяет имеющиеся в базе данных
физические блоки.
$view("db",22,dbname)
Функция возвращает текущий размер базы данных в мегабайтах и
предел роста базы данных в мегебайтах разделенные через запятую. Если на базу данных не установлено предела роста, то после запятой ничего не указывается. Если такая база данных не существует, то функция
генерирует ошибку <FUNCTION>.
$view("db",23,readonly)
Функция устанавливает всем базам данных которые отмечены как
смонтированные состояние "только чтение". Значение выражения readonly
вычисляется как число и сравнивается с нулем. Если не равно нулю, то
все базы переводятся в режим только чтение. Если равно нулю, то всем
базам снимается индикатор только чтение. Возврат пустая строка.
$view("db",24,dbname)
Функция возвращает текущее состояние "только чтение" для указанной базы данных.
$view("db",24,dbname,readonly)
Функция возвращает текущее состояние "только чтение" для указанной базы данных и устанавливает состояние "только чтение" если
значение выражения readonly не равно 0 или снимает его если равно
нулю.
5.38. $VIEW
5.38.2
201
$VIEW("dev")
Если первый параметр функции $view равен "dev" без учета регистра,
то это группа функций оперирования с устройствами.
$view("dev",1)
Получить номер сокета для текущего девайса. Если текущий девайс
не является TCP девайсом, то функция генерирует ошибку <FUNCTION>.
$view("dev",1,devname)
Получить номер сокета для указанного девайса. Если указанный девайс не является TCP девайсом, или он не открыт текущим процессом,
то функция генерирует ошибку <FUNCTION>.
$view("dev",2)
Получить номер акцептнутого сокета для текущего девайса. Если текущий девайс не является TCP девайсом, то функция генерирует ошибку
<FUNCTION>.
$view("dev",2,devname)
Получить номер акцептнутого сокета для указанного девайса. Если
указанный девайс не является TCP девайсом, или он не открыт текущим
процессом, то функция генерирует ошибку <FUNCTION>.
$view("dev",3,devname)
Если устройство является устройством типа |TCP| или типа |TNT|,
то функция возвращает имя удалённого компьютера, подключённого к
этому сокету. Если внешнего подключения нет, либо это устройство не
типа |TCP| или |TNT|, то функция возвращает пустую строку.
$view("dev",4,devname)
Если устройство является устройством типа |TCP| или типа |TNT|,
то функция возвращает адрес удалённого компьютера, подключённого к
этому сокету. Если внешнего подключения нет, либо это устройство не
типа |TCP| или |TNT|, то функция возвращает пустую строку.
$view("dev",5,mask,timeout)
Если текуще устройство это устройство типа |COM|, то функция
ожидает наступления события, заданного маской mask. Параметр timeout
необязателен, задает таймаут ожидания в секундах. Если текущее устройство иного типа, то генерируется ошибка <FUNCTION>.
Значение mask вычисляется как целое число и задает сумму флагов
событий, которые следует ожидать.
202
#0040
#0008
#0010
#0080
#0100
#0020
#0001
#0002
#0004
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Состояние разрыва приемной линии
Изменение состояния линии CTS
Изменение состояния линии DSR
Ошибка обрамления, перебега или четности
Входящий звонок на модем (сигнал на линии RI
порта)
Изменение состояния линии RLSD (DCD)
Символ принят и помещен в приемный буфер
Принят символ заданый значением EVTCHAR
Из буфера передачи передан последний символ
При истечении времени ожидания функция вызвращает значение 0.
При наступлении одного или нескольких указанных событий возвращается маска в виде суммы указанных флагов.
Маски являются единичными битами в различных позициях возвращаемого числа. Поэтому по правилам арифметики возвращаемое число
есть сумма отдельных чисел. Выяснить вхождение бита в возвращаемое
значение можно с помощью операций \ и #. Например, пусть возвращаемое число образовано суммой двух - #10+#20 (16+32), тогда выяснить
вхождение маски можно так (для наглядности используются шестнадцатеричные числа):
USER>w (#10+#20\#10#2)
1
USER>w (#10+#20\#20#2)
1
USER>w (#10+#20\#40#2)
0
USER>w (#10+#20\#8#2)
0
Значит что в число 48 маски #10 и #20 входят, а #40 и #8 не
входят. Поскольку символ # для команды write является управляющим,
выражение взято в круглые скобки.
$view("dev",6,mask)
Если текущее устройство является устройством типа |COM|, то функция устанавливает или управляет сигналами порта. Если текущее устройство иного типа, то генерируется ошибка <FUNCTION>.
Значение mask вычисляется как целое число и рассматривается как
код операции:
5.38. $VIEW
6
4
5
3
1
2
8
9
7
203
Сбрасывает сигнал DTR
Сбрасывает сигнал RTS
Устанавливет сигнал DTR
Устанавливает сигнал RTS
Симулирует прием символа XOFF
Симулирует прием символа XON
Переводит выходную линию передатчика в состояние разрыва.
Снимает состояние разрыва для выходной линии передатчика.
Сброс устройства (reset) если это применимо к
устройству.
Функция возвращает пустую строку.
$view("dev",7)
Если текущее устройство является устройством типа |COM|, то функция возвращает маску состояний сигналов модема (если он подключен к
этому COM порту). Если текущее устройство иного типа, то генерируется ошибка <FUNCTION>.
Возвращаемое значение есть сумма масок:
#10
#20
#40
#80
Сигнал CTS (clear-to-send) включен.
Сигнал DSR (data-set-ready) включен.
Сигнал звонка включен.
Сигнал RLSD (receive-line-signal-detect) включен.
$view("dev",8)
Если текущее устройство является устройством типа |FILE|, то функция возвращает текущее положение в файле. Если текущее устройство
иного типа, то генерируется ошибка <FUNCTION>.
$view("dev",8,devname)
Если указанное в параметре devname устройство является устройством типа |FILE|, то функция возвращает текущее положение в этом
файле. Если указанное устройство иного типа, то генерируется ошибка
<FUNCTION>.
204
5.38.3
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$VIEW("err")
Если первый параметр функции $view равен "err" без учета регистра, то
это группа функций оперирования с ошибками.
$view("err",1)
Получить местоположение последней ошибки в виде имя файла *
номер строки. Это отладочная информация, используемая при сборе диагностики для отправки разработчикам.
$view("err",2,errnumber)
Получить текстовое описание ошибки по номеру ошибки, определённое стандартом языка. Стандартные ошибки указываются в системной
переменной $ecode с префиксом M. Например, при обращении к неопределённой локальной переменной происходит ошибка M6:
$ecode=",M6,"
Чтобы получить текстовое описание ошибки, нужно передать её номер третьим параметром. Например:
w $view("err",2,6)
Undefined local variable.
Если значение второго параметра 2, а общее количество параметров
не равно 3 или в третьем параметре не указан корректный номер MDC
ошибки, то функция приводит к ошибке <FUNCTION>
$view("err",3)
Функция возвращает код возврата последнего вызова функции zdll.
Это значение возвращается экспортируемой функцией из внешней dll.
При нормальном завершении zdll функция возвращает значение 0, при
ошибке значение не 0. При ненулевом возврате процесс MiniM генерирует ошибку <FUNCTION>. При этом, используя функцию $view("err",3),
можно определить код возврата. В случае если функция zdll вызвала
ошибку нарушения памяти функция $view("err",3) возвращает значение
-1. После старта процесса функция $view("err",3) возвращает значение
0.
5.38. $VIEW
5.38.4
205
$VIEW("file")
Если первый параметр функции $view равен строке "file" без учета регистра, то это группа функций, выполняющих операции с файлами или
каталогами или возвращающих информацию о файлах или каталогах.
$view("file",1,name)
Возвращает индикатор, что это такое: 1 - если name это существующий файл, 2 - если name это существующий каталог, 0 - если name не
соответствует существующему файлу или каталогу.
$view("file",2,name)
Возвращает дату и время изменения файла или каталога в формате
$horolog. В случае, если имя не соответствует ни существующему файлу
ни существующему каталогу, возвращается пустая строка. Дата и время
возвращаются в локальном времени.
$view("file",3,name)
Возвращает дату и время создания файла или каталога в формате
$horolog. В случае, если имя не соответствует ни существующему файлу
ни существующему каталогу, возвращается пустая строка. Дата и время
возвращаются в локальном времени.
$view("file",4,name)
Возвращает дату и время последнего доступа к файлу или каталогу
в формате $horolog. В случае, если имя не соответствует ни существующему файлу ни существующему каталогу, возвращается пустая строка.
Дата и время возвращаются в локальном времени.
$view("file",5,name)
Возвращает размер файла в байтах. Если имя не соответствует существующему файлу, то возвращается пустая строка.
$view("file",6,name)
Удаляет файл. Если операция прошла успешно, возвращается значение 1, иначе 0. Функция не поддерживает маску имен.
$view("file",7,name)
Удаляет каталог. Если операция прошла успешно, возвращается значение 1, иначе 0. Функция не поддерживает маску имен.
$view("file",8,name,newname)
206
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Переименовывает или перемещает файл или каталог. Если операция
прошла успешно, возвращается значение 1, иначе 0. Функция не поддерживает маску имен.
$view("file",9,name,newname[,FailIfExist])
Копирует файл из name в newname. Параметр FailIfExist приводится к
числовому значению 0 или 1. Если параметр FailIfExist не указан, то принимается по умолчанию 1. Если 1, то функция заканчивается неуспешно
если файл с именем newname существует. Если параметр FailIfExist равен 0, то функция игнорирует возможное существование файла с именем
newname.
$view("file",10,name)
Возвращает строку символов с индикаторами атрибутов файла или
каталога. Если функция не смогла определить атрибуты, возвращается
значение -1. Строка состоит из индикаторов:
A
C
D
H
O
R
S
Archive. Файл или каталог предназначен для архивации.
Compressed. Файл или каталог хранятся сжатыми
средствами файловой системы. Для каталога означает, что все далее создаваемые в нем файлы или
подкаталоги по умолчанию создаются сжатыми.
Directory. Имя соответствует каталогу.
Hidden. Файл или каталог отмечены как скрытые.
Offline. Файл или каталог недоступны непосредственно.
ReadOnly. Файл только на чтение. Если это каталог,
то он не может быть удален.
System. Файл или каталог являются системными и
используются исключительно операционной системой.
Функция поддерживается только в Windows версиях MiniM Database
Server и MiniMono.
$view("file",11,name)
Возвращает короткое имя файла, в формате 8.3. Если операция получения короткого имени закончилась неуспешно, возвращается пустая
строка.
В не-Windows версиях функция не преобразует аргумент, и значение
5.38. $VIEW
207
аргумента возвращается как есть, без изменений.
$view("file",12)
Возвращает перечень букв логических дисков имеющихся на компьютере.
$view("file",13,name)
Возвращает строку индикатор типа устройства для указанного корневого имени.
0
1
REMOVABLE
FIXED
REMOTE
CDROM
RAMDISK
Тип устройства не может быть определен.
Такой корневой каталог не существует.
Носитель может быть извлечен из привода.
Неизвлекаемый носитель.
Удаленный (сетевой) диск.
Диск есть CD-ROM или DVD-ROM
Диск есть RAM диск.
$view("file",14,name)
Возвращает общий размер пространства на носителе и размер свободного пространства разделенные через запятую. Размер возвращается
в байтах. Если для указанного корневого имени не удалось определить
размеры, то возвращается пустая строка.
$view("file",15,names)
Удаляет файлы или каталоги с подкаталогами. В значении names
можно использовать символы файловой маски (*,?). В значении names
можно передавать несколько имен или масок файлов или каталогов, используя в качестве разделителя символ $c(0). Если операция выполнилась успешно полность, возвращается значение 1, иначе возвращается
значение 0.
Функция поддерживается только в Windows версиях MiniM Database
Server и MiniMono.
$view("file",16,name)
Создает каталог. Если операция завершилась успешно, то возвращается значение 1, иначе возвращается значение 0.
$view("file",17,names,dir)
Копирует файлы и каталоги, заданные в значении names, в каталог
dir. В значении names можно использовать маски имен (*,?). В значении names можно использовать несколько имен или масок файлов или
208
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
каталогов, заданные через разделитель $c(0). В качестве dir можно использовать только один каталог. Копирование производится с подкаталогами. При успешности выполнения операции полностью возвращается
значение 1, иначе 0.
Функция поддерживается только в Windows версиях MiniM Database
Server и MiniMono.
$view("file",18,names,to)
Перемещает или переименовывает файлы заданные значением names
в место заданное значением to. В значении names можно использовать
маски имен (*,?). В значении names можно использовать несколько имен
или масок файлов или каталогов, заданные через разделитель $c(0).
Перемещение или переименование каталогов производится с подкаталогами. При успешности выполнения операции полностью возвращается
значение 1, иначе 0.
Функция поддерживается только в Windows версиях MiniM Database
Server и MiniMono.
$view("file",19,name,attrs)
Устанавливает файлу name атрибуты attrs. В случае успешности выполнения возвращается значение 1, иначе значение 0. Строка attrs задает нечувствительно к регистру перечень символов означающие атрибуты
файла:
A
H
R
S
Archive. Установить атрибут, назначающий файл для
архивации.
Hidden. Установить атрибут скрытости.
ReadOnly. Установить атрибут только для чтения.
System. Установить атрибут что файл принадлежит
операционной системе.
Функция поддерживается только в Windows версиях MiniM Database
Server и MiniMono.
$view("file",20,commandline,options,dir)
Функция запускает на выполнение дочерний процесс операционной
системы и не ожидая его завершения возвращает id запущенного процесса. Если запуск не выполнен, то возвращается значение 0.
commandline
options
Командная строка
Опции запуска процесса
5.38. $VIEW
dir
209
Каталог дочернего процесса
Параметр commandline, то он задает параметры командной строки.
Именем исполняемого файла считается первая часть commandline до
первого пробела. При этом производится поиск запускаемого файла в
каталоге /bin инсталляции MiniM, в текущем каталоге процесса MiniM,
в системных каталогах Windows и в каталогах указанных в переменной
окружения PATH. Например:
w $v("file",20,"minimne.exe","s","")
w $v("file",20,"notepad.exe","s","")
Если указан непустой параметр options, то в нем ищутся символы
"S" или "s" нечувствительно к регистру. Если найден символ "S", то
окно запускаемого процесса показывается, иначе нет.
Если указан непустой параметр dir, то он считается именем каталога,
который должен быть текущим для запускаемого процесса.
$view("file",21,commandline,options,dir)
Функция запускает дочерний процесс Windows по указанным параметрам и ожидает его завершения. Функция возвращает код завершения
процесса. Параметры функции $view("file",21) совпадают с параметрами
функции $v("file",20).
$view("file",22,name)
Возвращает длинное, полное имя файла. Если операция получения
полного имени закончилась неуспешно или такого файла не существует,
возвращается пустая строка.
В не-Windows версиях функция не преобразует аргумент, и значение
аргумента возвращается как есть, без изменений.
5.38.5
$VIEW("jrnl")
Если первый параметр функции $view равен "jrnl" без учета регистра,
то эта группа функций возвращает или устанавливает настройки журналирования.
$view("jrnl",1)
Возвращает имя каталога журналирования. В этом каталоге создаются файлы журнала.
210
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
$view("jrnl",2)
Возвращает текущее имя файла журнала.
$view("jrnl",3)
Переключает имя файла журнала на новое имя. Имена формируются автоматически, имя, производное от текущей даты, расширение
- следующий свободный номер. Предыдущий файл журнала более не используется, все операции журналирования применяются к новому файлу.
Предыдущий файл журнала должен использоваться для операций бекапа и восстановления из него. Его следует сохранять, если эти операции
понадобятся. В случае если переключение файла журнала произошло
при незаконченных транзакциях, этот файл также следует сохранять до
окончания незакрытых транзакций, поскольку откат транзакций производится с применением предыдущего файла журнала.
$view("jrnl",4,filename)
Функция возвращает признак 0 или 1, является ли указанный файл
файлом журнала. Параметр filename - имя файла, для которого требуется
выполнить проверку.
$view("jrnl",5)
Функция отправляет демону журналирования сигнал о необходимости выполнить транкейт (усечение) журнала. Функция выставляет сигнал и возвращает управление. Функция $view("jrnl",5) возвращает пустую строку. При усечении журнала демон журнала трансформирует
файлы журнала, оставляя в них лишь информацию, необходимую для отката транзакций. Размер оставляемых файлов журнала может быть как
маленький, так и большой, в зависимости от текущей активности сервера. Усечение выполняется до отметки "отсутствие транзакций". Такая
отметка в журнале производится как периодически при возникновении
такого состояния, так и после старта сервера после восстановления файлов данных и отката незакоммиченных транзакций. Транкейт журнала
может выполняться на усмотрение программистов и администраторов и
может выполняться как вручную, так и в сочетании с операцией бекапа.
Выполнение транкейта может быть рекомендовано при полном бекапе,
поскольку состояние баз данных может быть восстановлено имея бекап и остаток журнала который остается после транкейта. Для работы
операции усечения может быть использовано дисковое пространство не
большее чем текущий размер всех файлов журнала.
5.38. $VIEW
5.38.6
211
$VIEW("lock")
Если второй параметр функции $view равен "lock" без учета регистра, то
эта группа функций возвращает информацию о состоянии блокировок.
$view("lock",1)
Возвращает количество памяти, занятой блокировками для команд
lock.
$view("lock",2)
Возвращает количество памяти, выделенной для блокировок команд
lock.
$view("lock",3)
Возвращает количество памяти, занятой блокировками страниц кэша.
$view("lock",4)
Возвращает количество памяти, выделенное для блокировок страниц
кэша.
5.38.7
$VIEW("log")
Если второй параметр функции $view равен "log" без учета регистра, то
эта группа функций возвращает информацию о системном логгировании
и выполняет операции с системным логом.
$view("log",1)
Возвращает текущее имя файла лога.
$view("log",1,newfilename)
Устанавливает новое имя файла лога. Ограничение по длине до 250
символов. Возвращает предыдущее значение файла лога.
$view("log",2)
Возвращает текущее значение чанка файла лога.
$view("log",2,newchunksize)
Устанавливает новое значение чанка файла лога в байтах. Ограничение по величине - минимум 1024 байта. Возвращает предыдущее значение чанка файла лога.
$view("log",3,arg1[,arg2...])
Выводит в файл лога последовательно аргументы arg1, arg2,... Возврат - пустая строка.
212
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
5.38.8 $VIEW("perf")
Если первый параметр функции $view равен "perf" без учета регистра, то
эта группа функций возвращает значения счетчиков производительности
и информацию о них.
$view("perf",1)
Функция возвращает количество поддерживаемых текущей версией
MiniM счетчиков производительности. В другие функции $view("perf")
передается номер счетчика, с нумерацией от 1.
$view("perf",2,n)
Функция возвращает значение счетчика с указанным номером. Если
указан недопустимый номер, то функция генерирует ошибку <FUNCTION>.
$view("perf",3,n)
Функция возвращает название счетчика с указанным номером. Если
указан недопустимый номер, то функция генерирует ошибку <FUNCTION>.
$view("perf",4,n)
Функция возвращает описание счетчика с указанным номером. Если
указан недопустимый номер, то функция генерирует ошибку <FUNCTION>.
MiniMono difference
В MiniM Embedded Edition счетчики производительности недоступны как счетчики Windows, но доступны программе на MUMPS через
функции $view("perf").
5.38.9
$VIEW("proc")
Если первый параметр функции $view равен "proc" без учета регистра,
то эта группа функций возвращает или устанавливает настройки процесса.
$view("proc",1)
Вернуть текущую настройку использования пустых индексов: 1 или
0. Начальное значение процесс получает из настроечного файла minim.ini
параметр NullSubscripts. В течение работы процесса он может изменить
эту величину для себя.
$view("proc",1,NullSubscripts)
5.38. $VIEW
213
Установить для текущего процесса разрешение (+NullSubscripts’=0)
или запрещение (+NullSubscripts=0) использовать пустые индексы. Изменение отношения к пустым индексам распространяется только на текущий процесс.
$view("proc",2)
Вернуть состояние журналирования для текущего процесса. Значение 1 означает, что операции, проводимые процессом, журналируются,
значение 0, что не журналируются. В журнал идут записи, если у процесса включено журналирование и для той базы, с которой идут операции журналирования, также включено.
$view("proc",2,JournalFlag)
Установить текущему процессу состояние журналирования и вернуть
предыдущее значение. Значение JournalFlag является логическим, приводится к целому числу и округляется. Если 0, то журналирование для
процесса выключается, если не 0, то включается.
$view("proc",3,JobNumber)
Приостановить выполнение процесса. Процесс замораживается, если он находится в состоянии чтения или блокирования с тайм-аутом, то
счетчик тайм-аута продолжает увеличиваться и по возобновлении выполнения процесса, выполняемая им операция с тайм-аутом, может закончиться по истечению тайм-аута. Возобновить выполнение этого процесса можно через функцию $view("proc",4,JobNumber). Нельзя применить
эту функцию к текущему процессу.
$view("proc",4,JobNumber)
Возобновить выполнение процесса, приостановленного ранее функцией $view("proc",3,JobNumber). Нельзя применить эту функцию к текущему процессу.
$view("proc",5)
Вернуть текущий режим обработки конца входного потока. Если 1,
то генерируется ошибка <ENDOFFILE>. Это режим инсталляции MiniM
по умолчанию.
$view("proc",5,mode)
Вернуть текущий режим обработки конца входного потока и выставить текущий режим. Если mode равно 0, то не генерировать ошибку
<ENDOFFILE>, иначе - генерировать.
$view("proc",6)
214
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Вернуть каталог \bin текущей инсталляции сервера. Например:
USER>w $view("proc",6)
W:\MiniM\bin\
$view("proc",7)
Вернуть текущий каталог процесса MiniM. Например:
USER>w $v("proc",7)
W:\MiniM\bin
Возвращаемые значения могут отличаться по значению для разных
процессов, если сервер запускается с логического диска, полученного
командой subst. Но все эти значения указывают на один и тот же физический каталог.
В большинстве случаев текущий каталог процесса совпадает с каталогом \bin текущей инсталляции сервера.
$view("proc",8)
Вернуть количество переменных окружения текущего процесса minim.exe.
$view("proc",8,n)
Вернуть пару "имя=значение" переменной окружения по порядковому
номеру их следования. Например:
USER>w $v("proc",8,4)
COMPUTERNAME=AUGUST
USER>w $v("proc",8,5)
ComSpec=E:\WINNT\system32\cmd.exe
Если номер отрицательный или больше имеющегося количества, то
функция возвращает пустую строку. Отсчёт по номерам проводится от
нуля.
$view("proc",9,name)
Вернуть значение переменной окружения по её имени. Если переменной окружения с таким именем не найдено, то функция возвращает
пустую строку. Имя переменной окружения нечувствительно к регистру.
Например:
5.38. $VIEW
215
USER>w $v("proc",9,"comspec")
E:\WINNT\system32\cmd.exe
Если в значении аргумента name после имени переменной окружения
указан символ "=", то функция удаляет эту переменную окружения для
текущего процесса.
$view("proc",10)
Приостанавливает выполнение всех процессов сервера кроме демонов
и самого себя.
$view("proc",11)
Восстанавливает выполнение всех процессов сервера.
$view("proc",12)
Устанавливает состояние приостанова создания новых процессов. При
его выставлении имеющиеся процессы продолжают работать как обычно, но вновь запускаемые процессы ожидают разрешения стартовать.
Состояние разрешения старта новых процессов устанавливается либо
функцией $view("proc",13), либо при окончании процесса, либо при его
сбое.
$view("proc",13)
Разрешает старт новых процессов. По умолчанию старт новых процессов разрешен.
$view("proc",14)
Возвращает текущее значение приоритета процесса.
$view("proc",14,value)
Устанавливает новое значение приоритета процесса и возвращает предыдущее значение.
Значения приоритетов, используемые функцией $view("proc",14), зависят от целевой операционной системы MiniM Database Server:
Windows версия:
-2
-1
0
1
2
3
Приоритет IDLE, наименьший из возможных.
Приоритет ниже среднего.
Приоритет средний, значение приоритета процесса по
умолчанию.
Приоритет выше среднего.
Приоритет высокий.
Приоритет реального времени.
216
ГЛАВА 5. СТАНДАРТНЫЕ ФУНКЦИИ
Linux версия:
Значения приоритета лежат в диапазоне целых чисел от -20 до +20.
Среднему приоритету и приоритету процесса по умолчанию соответствует значение 0, меньшие значения соответствуют понижению приоритета,
большие - большему.
$view("proc",15)
Функция возвращает предельное число процессов, которое может запустить данный экземпляр MiniM. Общее число процессов определяется
как число лицензированных плюс 3 инженерных процесса.
$view("proc",16)
Функция возвращает число процессов текущего экземпляра MiniM,
запущенные в данный момент. При подсчете числа процессов этой функцией другие процессы не могут быть запущены, но при возврате управления из функции могут.
5.38.10
$VIEW("rou")
Если первый параметр функции $view равен "rou" без учета регистра,
то эта группа функций компилирует или выполняет другие действия с
синтаксическими конструкциями языка.
$view("rou","c",rouname)
Выполнить компиляцию рутины с именем rouname. Функция возвращает 0 в случае успешной компиляции или число обнаруженных ошибок. При работе функция выводит в текущее устройство результат компиляции. При компиляции функция порождает комиплированный байткод рутины и сохраняет его в глобаль ˆrOBJ.
$view("rou","s",line)
Фунция выполняет синтаксический разбор строки как строки команд.
В случае если строка синтаксически корректна возвращается пустая
строка, иначе возвращается строка с диагностической ошибкой, возникшей при синтаксическом анализе. Текущий контекст ошибок (значения
$zerror и $ecode) не изменяется.
Глава 6
Z - Функции
6.1
$ZABS
Возвращает абсолютное значение аргумента.
Синтаксис
$ZABS(arg)
Определение
arg
Вычисляемое выражение, абсолютное значение которого требуется.
Функция $zabs вычисляет аргумент, приводит его к числовому значению. Отбрасывает символы, не образующие числа, идущие после символов,которые образуют число, и вычисляет абсолютное значение (модуль).
TEMP>w $zabs("+7.0e+1 degrees")
70
TEMP>w $zabs("-7.0e-1 is approximate value of 135 degrees")
.7
TEMP>w $zabs(456)
456
TEMP>w $zabs(-123)
123
Если в начале значения arg нет символов, образующих число, то
принимается значение, равное 0.
TEMP>w $zabs("")
217
218
ГЛАВА 6. Z - ФУНКЦИИ
0
TEMP>w $zabs("-")
0
TEMP>w $zabs("abcd")
0
6.2 $ZARCCOS
Возвращает арккосинус числа, выраженного в радианах.
Синтаксис
$ZARCCOS(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Число на входе должно лежать в диапазоне от -1 до 1; другие числа
приводят к ошибке.
Результат возвращается в канонической форме, вне зависимости от
вида подаваемого на вход Числа.
Примеры:
TEMP>w $zarccos(-2)
<ILLEGAL VALUE>
TEMP>w $zarccos(0.8)
.643501108793284
TEMP>w $zarccos(0.2)
1.36943840600457
TEMP>w $zarccos(0)
1.5707963267949
6.3 $ZARCSIN
Возвращает арксинус числа, выраженного в радианах.
Синтаксис
6.4. $ZARCTAN
219
$ZARCSIN(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Число на входе должно лежать в диапазоне от -1 до 1; другие числа
приводят к ошибке.
Результат возвращается в канонической форме, вне зависимости от
вида подаваемого на вход Числа.
Примеры:
TEMP>w $zarcsin(0.7)
.775397496610753
6.4 $ZARCTAN
Возвращает арктангенс числа, выраженного в радианах.
Синтаксис
$ZARCTAN(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Возвращаемое значение лежит в диапазоне от -1.57079 (−π/2) до
1.57079 (+π/2).
Результат возвращается в канонической форме, вне зависимости от
вида подаваемого на вход Числа.
В связи с конечной точностью представления десятичных чисел, вызов $zarctan не приводит к ошибке.
Примеры:
TEMP>w $zarctan(1)
.785398163397448
220
6.5
ГЛАВА 6. Z - ФУНКЦИИ
$ZBITAND
Выполняет логическую операцию AND (И) над аргументами - битовыми
строками.
Синтаксис
$ZBITAND(bitstr1,bitstr2)
Определение
Первый аргумент, он используется как битовая строка.
Второй аргумент, он используется как битовая строка.
bitstr1
bitstr2
Функция $zbitand считает, что аргументами являются битовые строки (и проверяет это), выполняет операцию побитового AND (И) и возвращает результат. В случае если строки имеют разную битовую длину,
то функция возвращает результат по аргументу меньшей длины и считает, что недостающие биты бо́льшей строки логически эквивалентны
нулевым.
Если аргументы не являются корректными битовыми строками, то
функция $zbitand генерирует ошибку <FUNCTION>.
Например, если bitstr1=[1010], bitstr2=[10000000], то в качестве результата функция $zbitand возвращает битовую строку [1000].
6.6
$ZBITCAT
Возвращает битовую строку полученную конкатенацией двух указанных
битовых строк.
Синтаксис
$ZBITCAT(bitstr1,bitstr2)
Определение
bitstr1, bitstr2
Вычисляемое выражение, битовая строка для конкатенации.
Функция $zbitcat получает новую битовую строку, состоящую из битов первой строки bitstr1, за которыми идут биты второй строки bitstr2.
6.8. $ZBITEXTRACT
221
Длина получаемой битовой строки в битах равна длине исходных строк
в битах.
Примеры:
USER>s a=$zbitstr(9,1)
USER>s b=$zbitstr(9,0)
USER>s str=$zbitcat(a,b)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
111111111000000000
6.7
$ZBITCOUNT
Возвращает количество единичных бит в битовой строке.
Синтаксис
$ZBITCOUNT(bitstr)
Определение
Значение, вычисляемое как битовая строка.
bitstr
Функция $zbitcount возвращает количество единичных бит в битовой строке. Если аргумент не является корректной битовой строкой, то
функция генерирует ошибку <FUNCTION>. Например, если bitstr =
[1100011], то функция $zbitcount возвращает 4.
6.8
$ZBITEXTRACT
Возвращает битовую строку, полученную из части битов исходной.
Синтаксис
$ZBITEXTRACT(bitstr,from,count)
Определение
bitstr
Вычисляемое выражение, исходная битовая строка.
222
ГЛАВА 6. Z - ФУНКЦИИ
Номер бита, с которого надо взять битовую подстроку. Отсчет ведется от 1.
Количество битов, которые надо вернуть.
from
count
Функция $zbitextract возвращает битовую строку, полученную из
указанного количества битов исходной битовой строки начиная с указанной позиции. В случае если исходная битовая строка не соответствует
формату битовой строки или заданный параметрами from и count диапазон не принадлежит полностью исходной строке, генерируется ошибка
<FUNCTION>.
USER>s a=$zbitstr(3,1),b=$zbitstr(3,0),str=$zbitcat(a,b)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
111000
USER>s str=$zbitextract(str,2,3)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
110
6.9
$ZBITFIND
Ищет заданный бит с заданной позиции и возвращает номер следующего
за ним бита.
Синтаксис
$ZBITFIND(bitstr,bit[,position])
Определение
bitstr
bit
position
Значение, используемое как битовая строка.
Значение, вычисляемое как число и задающее, какой
бит искать 0 или не 0.
Необязательный параметр, задаёт позицию, с какой
начинать поиск. Если не указан, позиция считается
равной 1.
Функция $zbitfind ищет в битовой строке bitstr бит bit, начиная с
заданной позиции. Если в этой или ближайшей следующей за ней позицией такой бит отыскивается, то функция возвращает номер следующей
6.10. $ZBITGET
223
за ней позиии. Даже если такой позиции в битовой строке не существует
(найдет последний бит).
Если заданного бита не найдено, то функция возвращает значение 0.
Если номер позиции не указан, то он считается равным 1, и поиск
ведётся с первого бита.
Если номер позиции бита меньше 1 или больше максимальной длины
битовой строки (262128 = 32766 ∗ 8), то функция генерирует ошибку
<FUNCTION>.
Пример:
TEMP>s str=$zbitstr(5,1)
TEMP>s i=1 f
2
3
4
5
6
6.10
s i=$zbitfind(str,1,i) q:’i
w i,!
$ZBITGET
Возвращает значение бита в битовой строке в указанной позиции.
Синтаксис
$ZBITSTR(bitstr,position)
Определение
bitstr
position
Вычисляемое значение, битовая строка, в которой
определяется значение бита.
Позиция в битовой строке, в которой определяется
значение бита.
Функция $zbitget возвращает значение бита (0 или 1) в заданной
битовой строке bitstr в заданной позиции position.
Позиции битов отсчитываются от 1.
Если позиция вычисляется как число, меньшее 1 или большее максимального числа битов (262128 = 32766 ∗ 8), то функция генерирует
ошибку <FUNCTION>.
Пример:
224
ГЛАВА 6. Z - ФУНКЦИИ
TEMP>s str=$zbitstr(5,1)
TEMP>f i=1:1:$zbitlen(str) w $zbitget(str,i)
11111
6.11
$ZBITLEN
Возвращает количество битов в битовой строке.
Синтаксис
$ZBITLEN(bitstr)
Определение
bitstr
Вычисляемое значение, считающееся битовой строкой, количество битов в которой требуется определить.
Функция $zbitlen проверяет, что значение bitstr является корректной
битовой строкой, иначе генерирует ошибку <FUNCTION>. После чего
вычисляет количество битов в bitstr. Возвращается их общее количество,
считаются только позиции битов, независимо от их значения - 1 или 0.
Примеры:
TEMP>w $zbitlen($zbitstr(9,1))
9
TEMP>w $zbitlen($zbitstr(15,0))
15
6.12 $ZBITNOT
Возвращает битовую строку с инвертированными значениями битов.
Синтаксис
$ZBITNOT(bitstr)
Определение
bitstr
Вычисляемое выражение, битовая строка для инвертирования.
6.13. $ZBITOR
225
Функция $zbitnot проверяет, является ли значение bitstr корректной битовой строкой и возвращает битовую строку, с инвертированными
относительно неё значениями битов в тех же позициях. Длина возвращаемой битовой строки совпадает с длиной строки bitstrв битах.
Примеры:
TEMP>s str=$zbitstr(25,1)
TEMP>f i=1:1:$zbitlen(str) w $zbitget(str,i)
1111111111111111111111111
TEMP>s str=$zbitnot(str)
TEMP>f i=1:1:$zbitlen(str) w $zbitget(str,i)
0000000000000000000000000
6.13
$ZBITOR
Выполняет логическую операцию OR (ИЛИ) над аргументами - битовыми строками.
Синтаксис
$ZBITOR(bitstr1,bitstr2)
Определение
bitstr1
bitstr2
Первый аргумент, используется как битовая строка.
Второй аргумент, используется как битовая строка.
Функция $zbitor считает, что аргументами являются битовые строки
(и проверяет это), выполняет операцию побитового OR (ИЛИ) и возвращает результат. В случае если строки имеют разную битовую длину,
то функция возвращает результат по аргументу бо́льшей длины и считает, что недостающие биты меньшей строки логически эквивалентны
нулевым.
Если аргументы не являются корректными битовыми строками, то
функция $zbitor генерирует ошибку <FUNCTION>.
Например, если bitstr1=[1010], bitstr2=[10000000], то в качестве результата функция $zbitor возвращает битовую строку [10100000].
226
ГЛАВА 6. Z - ФУНКЦИИ
6.14 $ZBITROT
Возвращает битовую строку с циклически переставленными битами.
Синтаксис
$ZBITROT(bitstr,direction)
Определение
bitstr
direction
Вычисляемое выражение, исходная битовая строка.
Вычисляемое выражение, задает направление циклической перестановки.
Функция $zbitrot получает битовую строку, состоящую из битов
строки bitstr, циклически переставленных на один бит. Если значение
direction вычисляется как 1, то перестановка битов выполняется вправо,
если как значение -1, то влево. При иных значениях direction генерируется ошибка <FUNCTION>.
Примеры:
Циклическая перестановка вправо:
USER>s a=$zbitstr(3,1),b=$zbitstr(3,0),str=$zbitcat(a,b)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
111000
USER>s str=$zbitrot(str,1)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
011100
Циклическая перестановка влево:
USER>s a=$zbitstr(3,1),b=$zbitstr(3,0),str=$zbitcat(a,b)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
111000
USER>s str=$zbitrot(str,-1)
USER>f i=1:1:$zbitlen(str) w $zbitget(str,i)
110001
6.15. $ZBITSET
6.15
227
$ZBITSET
Возвращает битовую строку с установленным битом в заданной позиции.
Синтаксис
$ZBITOR(bitstr,position,bit)
Определение
bitstr
position
bit
Битовая строка, на которой основана возвращаемая
строка.
Вычисляемое выражение, позиция устанавливаемого
бита.
Значение устанавливаемого бита.
Функция $zbitset берёт исходную строку bitstr, проверяет её на корректность, является ли она битовой строкой, и если нет, то генерирует
ошибку <FUNCTION>. Возвращаемая битовая строка основана на значении bitstr, с установленным в позиции position битом в значение bit.
Значение position вычисляется как целое число. В случае если значение меньше 1, то функция генерирует ошибку <FUNCTION>. В случае
если значение больше максимально допустимого (262128 = 32766 ∗ 8),
функция также генерирует ошибку <FUNCTION>. В случае если значение позиции position больше максимального количества битов в строке
bitstr, то функция $zbitstr не производит расширение строки и дополнение нулями, а генерирует ошибку <FUNCTION>.
Значение bit вычисляется как число, сравнивается с нулевым значением, и если 0, то устанавливается бит 0, иначе устанавливается бит
1.
Пример:
TEMP>s str=$zbitstr(15,1)
TEMP>f i=1:1:$zbitlen(str) w $zbitget(str,i)
111111111111111
TEMP>s str=$zbitset(str,12,0)
TEMP>f i=1:1:$zbitlen(str) w $zbitget(str,i)
111111111110111
228
6.16
ГЛАВА 6. Z - ФУНКЦИИ
$ZBITSTR
Создаёт значение - битовую строку из заданного количества заданных
битов.
Синтаксис
$ZBITSTR(количество,бит)
Определение
Количество
Бит
Значение вычисляется как число и задаёт количество
бит в результате.
Значение вычисляется как целое число и указывает,
каким битом заполнить строку.
Функция $zbitstr создаёт значение битовой строки. Количество бит
указано параметром Количество. Каким битом заполнять, указано параметром Бит. Значение Количество должно быть положительным или
больше нуля, но быть меньше, чем 262128 (32766 ∗ 8). Значение Бит
вычисляется как число и сравнивается с нулём. Если равно 0, то для
заполнения используется бит 0, иначе бит 1.
Примеры:
TEMP>ZZDUMP $ZBITSTR(-12,2)
<FUNCTION>
TEMP>ZZDUMP $ZBITSTR(500000,2)
<FUNCTION>
$zbitstr(15,1) возвращает битовую строку из 15 единичных битов.
$zbitstr(32,0) возвращает битовую строку из 32 нулевых бита.
6.17
$ZBITXOR
Выполняет логическую операцию XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) над
аргументами - битовыми строками.
Синтаксис
$ZBITXOR(bitstr1,bitstr2)
Определение
6.18. $ZBOOLEAN
229
Первый аргумент, используется как битовая строка.
Второй аргумент, используется как битовая строка.
bitstr1
bitstr2
Функция $zbitxor считает, что аргументами являются битовые строки (и проверяет это), выполняет операцию побитового XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) и возвращает результат. В случае если строки имеют
разную битовую длину, то функция возвращает результат по аргументу
меньшей длины.
Если аргументы не являются корректными битовыми строками, то
функция $zbitxor генерирует ошибку <FUNCTION>.
Например, если bitstr1=[1010], bitstr2=[10000000], то в качестве результата функция $zbitxor возвращает битовую строку [0010].
6.18
$ZBOOLEAN
Функция выполняет побитовую логическую операцию над аргументами.
Синтаксис
$ZBOOLEAN(arg1,arg2,bitoper)
$ZB(arg1,arg2,bitoper)
Определение
arg1
arg2
bitoper
Первый аргумент, строка или целое число
Второй аргумент, строка или целое число
Код побитовой операции
Функция $zboolean выполняет побитовую логическую операцию над
аргументами заданными arg1 и arg2, код операции указывается в аргументе bitoper. Функция возвращает результат побитовой операции.
Функция рассматривает аргументы arg1 и arg2 либо как целые числа,
либо как строки. В случае, если аргумент является дробным числом,
фунция генерирует ошибку <FUNCTION>. Если оба аргумента целые
числа, то выполняется побитовая операция над целыми числами. Иначе
оба аргумента рассматриваются как строки и выполняется побитовая
операция над байтами строк.
При использовании аргументов arg1 и arg2 как строк длина результата соответствует длине аргумента arg1, если не указано обратное. В
случае если длина аргумента arg2 больше чем arg1, то он используется
230
ГЛАВА 6. Z - ФУНКЦИИ
только на длину аргумента arg1. В случае если длина аргумента arg2
меньше чем arg1, то он применяется к операции с arg1 циклически.
Аргумент bitoper вычисляется и рассматривается как целое число
от 0 до 15 включительно. В случае если значение отрицательное то
рассматривается как значение 0. В случае если значение больше 15 то
рассматриваются младшие 4 бита как числа от 0 до 15 включительно.
Значения bitoper соответствуют выполняемым побитовым операциям:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
arg1 & arg2
arg1 & ~ arg2
arg1
~ arg1 & arg2
arg2
arg1 ^ arg2
arg1 ! arg2
~ ( arg1 ! arg2 )
~ ( arg1 ^ arg2 )
~ arg2
arg1 ! ~ arg2
~ arg1
~ arg1 ! arg2
~ ( arg1 & arg2 )
-1
Здесь обозначены операции
&
!
~
^
AND
OR
NOT
exclusive OR
В случае если программист хочет использовать значения аргументов
как числа, то он может гарантировать приведение возможной строки к
числу с помощью операции +, а для приведения возможного числа к
строке с помощью конкатенации с пустой строкой.
Примеры
6.19. $ZCOS
231
USER>w $zb(1,2,3)
1
USER>w $zb(1,2,6)
3
USER>w $zb(1,2,7)
3
USER>w $zb(1,2,12)
-2
USER>w $zb("aa","bb",7)
cc
USER>s xorkey="this is key"
USER>s str1="this is string with data"
USER>s str2=$zb(str1,xorkey,6)
USER>s str3=$zb(str2,xorkey,6)
USER>w str1,!,str3,!
this is string with data
this is string with data
USER>w str2
??
???SW HK??
6.19 $ZCOS
Возвращает косинус числа, выраженного в радианах.
Синтаксис
$ZCOS(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Косинус вычисляется для чисел в диапазоне от -π до π (может быть
применена системная переменная $ZPI), все остальные числа приводятся к этому диапазону.
232
ГЛАВА 6. Z - ФУНКЦИИ
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Примеры:
>w $zcos(-3*$zpi/4)
-.7071067811865475242
Примечание: вычисления производятся с плавающей точкой, поэтому следует обращать внимание на то, что компьютерные вычисления и
вычисления в математике совпадают лишь с некоторой погрешностью.
TEMP>w $zcos($zpi/2)
6.12303176911189E-17
6.20
$ZCOT
Возвращает котангенс числа, выраженного в радианах.
Синтаксис
$ZCOT(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Котангенс вычисляется для чисел в диапазоне от -π до π (может быть
применена системная переменная $ZPI), все остальные числа приводятся к этому диапазону.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Вызов $zcot(0) приводит к ошибке, однако $zcot($zpi) и т.п. ошибки
не вызывают, в связи с конечной точностью представления десятичных
чисел.
TEMP>w $zcot(0)
<DIVIDE>
TEMP>w $zcot($zpi/4)
1
6.21. $ZCRC
6.21
233
$ZCRC
$ZCRC
Вычисляет контрольную сумму по выбранному алгоритму.
Синтаксис
$ZCRC(Строка,Алгоритм) - двухаргументная форма
$ZCRC(Строка,Алгоритм,НачЗначение) - трехаргументная форма
Определение
Строка
Алгоритм
НачЗначение
Последовательность байт, для которой вычисляется
контрольная сумма.
Обозначение алгоритма, который используется при
вычислении контрольной суммы.
Необязательный параметр, начальное значение контрольной суммы.
Алгоритмы контрольной суммы
В качестве Алгоритма может быть указано обозначение одного из
поддерживаемых алгоритмов:
SUM
XOR
16
32
CCITT
MD5
иное
Вычисляется сумма байтов как 8-битных без знака.
Вычисляется контрольная сумма, используя операцию XOR (исключающее ИЛИ).
Используется алгоритм CRC-16.
Используется алгоритм CRC-32.
Используется алгоритм CRC-CCITT.
Вычисление хеш-кода по алгоритму MD5.
Функция генерирует ошибку <FUNCTION>.
Строка с именем алгоритма нечувствительна к регистру.
Для вычисления контрольной суммы длинных последовательностей
байт, которые не могут быть представлены одной строкой, поддерживается необязательный параметр НачЗначение, в который передается значение контрольной суммы от предыдущей части последовательности.
При использовании алгоритма хеширования MD5 необязательный параметр НачЗначение не должен использоваться, при его указании генерируется ошибка <FUNCTION>.
Примеры:
234
ГЛАВА 6. Z - ФУНКЦИИ
TEMP>w $zcrc("abcdef","XOR")
7
TEMP>w $zcrc("abcdef","XOR",3)
4
TEMP>w $zcrc("abcdef","16")
22533
TEMP>w $zcrc("abcdef","32")
1267612143
TEMP>w $zcrc("abcdef","SUM")
597
TEMP>w $zcrc("abcdef","CCITT")
62329
TEMP>w $zcrc("abcdef","www")
<FUNCTION>
USER>w $zcrc("","md5")
D41D8CD98F00B204E9800998ECF8427E
USER>w $zcrc("","md5",123)
<FUNCTION>
6.22 $ZCSC
Возвращает косеканс числа, выраженного в радианах.
Синтаксис
$ZCSC(Число)
Определение
Число
Произвольное выражение, вычисляемое как число
Дополнения.
Косеканс вычисляется для чисел в диапазоне от -π до π (может быть
применена системная переменная $ZPI), все остальные числа приводятся к этому диапазону.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
В связи с конечной точностью представления десятичных чисел, вы-
6.23. $ZCONVERT
235
зов $zcsc($zpi/2) и т.п. не приводит к ошибке.
Пример:
TEMP>w $zcsc($zpi/4)
1.41421356237309
6.23
$ZCONVERT
$ZCONVERT
$ZCVT
Производится перекодировка строки по заданному в параметрах алгоритму.
Синтаксис
$ZCONVERT(Строка,Направление) - двухаргументная форма.
$ZCONVERT(Строка,Направление,Формат) - трехаргументная форма.
Определение
Строка
Направление
Значение, с которым следует провести операцию конвертации.
Индикатор, что следует сделать со Строкой.
Значения Направление могут быть:
"l", "L"
"u", "U"
"o", "O"
"i", "I"
Конвертировать Строку в нижний регистр.
Конвертировать Строку в верхний регистр.
Конвертировать Строку в выходной формат.
Конвертировать из Строки как из входного формата.
Форматы конвертации
"URL"
"XML"
"IHEX"
"SHEX"
"BASE64"
Использовать URL-кодирование.
Заменять xml - сущности.
Считать форматом целое число в шестнадцатеричной
форме.
Считать форматом строку в шестнадцатеричной форме.
Кодирование BASE64 (RFC 989)
236
"S1"
"S2"
"S4"
"S8"
"U1"
"U2"
"U4"
"F4"
"F8"
ГЛАВА 6. Z - ФУНКЦИИ
Бинарное знаковое целое 1 байт
Бинарное знаковое целое 2 байт
Бинарное знаковое целое 4 байт
Бинарное знаковое целое 8 байт
Бинарное беззнаковое целое 1 байт
Бинарное беззнаковое целое 2 байт
Бинарное беззнаковое целое 4 байт
Бинарное число с плавающей точкой 4 байт
Бинарное число с плавающей точкой 8 байт
Имя формата нечувствительно к регистру. Определение регистра производится по текущей таблице локализации. При указании неправильных значений направления и имени формата происходит ошибка. Конвертация бинарного представления чисел производится в порядке littleendian (порядок процессоров Intel).
Примеры:
USER>w $zcvt("Текст","u")
ТЕКСТ
USER>w $zcvt("Текст","l")
текст
USER>w $zcvt("Текст","o","url")
%D2%E5%EA%F1%F2
USER>w $zcvt("22 < 33","o","xml")
22 < 33
USER>w $zcvt("22 < 33","o","shex")
3232203C203333
USER>w $zcvt("123456","o","ihex")
1E240
USER>s base64=$zcvt("Hello, world!","o","base64")
USER>s src=$zcvt(base64,"i","base64")
USER>w
base64="SGVsbG8sIHdvcmxkIQ=="
src="Hello, world!"
USER>zzdump $zcvt("127","o","s1")
0000: 7F
USER>w $zcvt($zcvt("250","o","u1"),"i","s1")
-6
6.24. $ZDATE
237
USER>zzdump $zcvt(123.456,"o","f8")
0000: 77 BE 9F 1A 2F DD 5E 40
6.24
$ZDATE
Преобразует дату из формата $horolog в строковое представление по
одному из заданных форматов.
Синтаксис
$ZD[ATE](Value[,Format[,FormatString]])
Определение
Целочисленное выражение, дата в формате $horolog.
Используется первая часть $horolog без времени.
Format
Целочисленное выражение, номер используемого
формата. Параметр необязателен. Если не указан, используется значение по умолчанию 1.
FormatStringСтрока форматирования если значение Format=15
Value
Значение параметра Value допустимо от -672045 (дата 1 января 1
года) до 2980013 (31 декабря 9999 года). При задании недопустимого
значения генерируется ошибка <ILLEGAL VALUE>.
Значение параметра Format задаёт один из видов форматирования
даты:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DD Mmm YYYY (08 Mar 2006)
MM/DD/YYYY (03/08/2006)
DD Mmm YYYY (08 Mar 2006)
YYYY-MM-DD (2006-03-08)
DD/MM/YYYY (08/03/2006)
Mmm D, YYYY (Mar 8, 2006)
Mmm D YYYY (Mar 8 2006)
Mmm DD YYYY (Mar 08 2006)
YYYYMMDD (20060308)
Mmmmm D, YYYY (March 8, 2006)
W (3)
Www (Wed)
Wwwww (Wednesday)
D Mmmmm YYYY (8 March 2006)
DD.MM.YYYY (08.03.2006)
238
ГЛАВА 6. Z - ФУНКЦИИ
Обозначения:
D
DD
MM
YYYY
Mmm
Mmmmm
W
Www
Wwwww
Число, день месяца (1-31) без лидирующего нуля для
чисел меньше 10.
Двузначное число, день месяца (1-31) с дополнением,
лидирующим нулём для чисел меньше 10.
Двузначное число месяца (01-12).
Четырёхзначное число года.
Сокращённое наименование месяца.
Полное наименование месяца.
День недели (0-6, 0-Понедельник, 1-Вторник, ...).
Сокращённое наименование дня недели.
Полное наименование дня недели.
При задании номера формата равного 15 (Format=15) используется
значение FormatString для представления даты. В строке FormatString
ищутся символы форматирования, идущие после символа процент (%).
В случае если после него стоит один из известных символов, в выходную строку печатается представление одной из частей даты. Если после
символа % следует также символ % то выводится символ %. Если после
символа % стоит неподдерживаемый спецификатор формата, то выводятся символы 00. Значения форматов, которые поддерживаются:
a
A
b
B
d
H
I
j
m
M
p
S
U
w
W
y
Сокращенное название дня недели
Полное название дня недели
Сокращенное название месяца
Полное название месяца
День месяца
Час (24)
Час (12)
День года
Номер месяца
Минута
Символ AM/PM
Секунда
Неделя года, где первая неделя начинается с воскресенья
День недели
Неделя года, где первая неделя начинается с понедельника
Номер года без столетий
6.25. $ZDATEH
Y
C
#d
%
239
Номер года со столетиями
Столетие
Не выводить лидирующие нули дня месяца.
Символ %
Например:
USER>w $zd($h,15,"Now is %#d day of %m month of %Y year.")
Now is 21 day of 12 month of 2008 year.
USER>w $zd($h,15,"%#d.%m.%Y %H:%S")
21.12.2008 17:31
При задании недопустимого значения Format генерируется ошибка
<FUNCTION>.
Названия месяцев и дней недели сервер берёт из настроек пользователя, под которым стартует сервис. Чтобы изменить эти названия, нужно
указать сервису вход, под каким пользователем ему следует осуществлять и настроить локальные параметры этого пользователя (язык и локализацию). После перезапуска сервера названия месяцев и дней недели будут выводиться на языке этого пользователя одинаково для всех
процессов сервера этой инсталляции. Остальные параметры и символы
форматирования не меняются и не зависят от настроек пользователя, от
имени которого стартует сервис.
6.25
$ZDATEH
Преобразует дату из форматированной в строковом представлении по
одному из заданных форматов в значение в формате $horolog.
Синтаксис
$ZDATEH(Value[,Format])
$ZDH(Value[,Format])
Определение
Value
Format
Форматированное представление даты в одном из
форматов.
Целочисленное выражение, номер используемого
формата. Параметр необязателен. Если не указан, используется значение по умолчанию 1.
240
ГЛАВА 6. Z - ФУНКЦИИ
Значение параметра Format задаёт один из видов форматирования
даты:
0
1
2
3
4
5
6
7
8
9
13
14
DD Mmm YYYY (08 Mar 2006)
MM/DD/YYYY (03/08/2006)
DD Mmm YYYY (08 Mar 2006)
YYYY-MM-DD (2006-03-08)
DD/MM/YYYY (08/03/2006)
Mmm D, YYYY (Mar 8, 2006)
Mmm D YYYY (Mar 8 2006)
Mmm DD YYYY (Mar 08 2006)
YYYYMMDD (20060308)
Mmmmm D, YYYY (March 8, 2006)
D Mmmmm YYYY (8 March 2006)
DD.MM.YYYY (08.03.2006)
Обозначения:
D
DD
MM
YYYY
Mmm
Mmmmm
Число, день месяца (1-31) без лидирующего нуля для
чисел меньше 10.
Двузначное число, день месяца (1-31) с дополнением,
лидирующим нулём для чисел меньше 10.
Двузначное число месяца (01-12.)
Четырёхзначное число года.
Сокращённое наименование месяца.
Полное наименование месяца.
При задании недопустимого значения Format генерируется ошибка
<FUNCTION>. Форматы и коды форматов совпадают с форматами функции $zd(), за исключением форматирования дня недели и его наименования.
Минимальная поддерживаемая дата 1 января 1 года, максимальная 31 декабря 9999 года. При задании даты вне этого диапазона генерируется ошибка <ILLEGAL VALUE>.
Названия месяцев и дней недели сервер берёт из настроек пользователя, под которым стартует сервис. Чтобы изменить эти названия, нужно
указать сервису вход, под каким пользователем ему следует осуществлять и настроить локальные параметры этого пользователя (язык и локализацию). После перезапуска сервера названия месяцев и дней недели будут выводиться на языке этого пользователя одинаково для всех
процессов сервера этой инсталляции. Остальные параметры и символы
6.26. $ZDLL
241
форматирования не меняются и не зависят от настроек пользователя, от
имени которого стартует сервис.
6.26
$ZDLL
$ZDLL
Производит загрузку, выгрузку модулей ZDLL и вызов их функций.
Синтаксис
$ZDLL("load",filename)
$ZDLL("call",filename,funcname[,param,...])
$ZDLL("unload")
$ZDLL("unload",filename)
Определение
filename
funcname
param
Cтрока с именем файла dll.
Строка с именем фунции, определённой программистом ZDLL.
Значения параметров передаваемых функции.
Функция $zdll производит загрузку или выгрузку внешней dll, поддерживающей интерфейс ZDLL, или вызывает её функцию с передачей
значений параметров и возвращает значение возврата этой функции. Режим работы функции определяется значением первого аргумента. Строка
первого аргумента может принимать одно из трех значений - load (загрузить), unload (выгрузить) и call (вызвать). Значение первой строки
функцией рассматривается нечувствительно к регистру.
LOAD
В режиме загрузки требуется второй параметр с именем модуля zdll.
Модуль отыскивается по указанному имени файла, нечувствительно к
регистру среди загруженных, и если модуль ещё не был загружен ранее,
то файл dll отыскивается в каталоге инсталляции сервера bin, после
чего в каталогах, перечисленных в переменной среды PATH. Расширение
файла может быть любым, необязательно иметь расширение dll.
После нахождения файла dll динамическая библиотека загружается
и инициализируется. В ней отыскивается экспортированная функция с
именем ZDLL и вызывается для получения таблицы описаний имеющих-
242
ГЛАВА 6. Z - ФУНКЦИИ
ся в модуле функций. После этого указатель на таблицу сохраняется до
выгрузки модуля, либо до окончания работы процесса.
Имена dll рекомендуется указывать так, чтобы средства операционной системы их находили однозначно, работая под всеми разрешёнными
администратором аккаунтами. Наиболее простое место для их размещения - каталог инсталляции bin. В случае размещения файлов dll на
сетевых дисках или на дисках, полученных командой subst, администратор или программист должны проверить, что сервер MiniM корректно
определяет их положение под всеми необходимыми аккаунтами.
В режиме загрузки функция либо возвращает пустую строку, либо в
случае невозможности загрузить модуль, генерирует ошибку <FUNCTION>.
UNLOAD
Режим unload может использоваться как в одноаргументной, так и в
двухаргументной форме. В одноаргументной форме процесс MiniM выгружает все ранее загруженные модули ZDLL. В двухаргументной форме
второму аргументу должно передаваться имя файла модуля zdll. Если он
был среди загруженных, то он выгружается.
CALL
В режиме обращения к функции модуля ZDLL процесс ищет модуль
среди ранее загруженных, и если не находит такого, то загружает, вызывает указанную функцию и после вызова выгружает модуль. Процесс
ищет среди указанных программистом ZDLL функций функцию с именем, заданным третьим параметром. Если находит, то формирует для
вызова параметры. Все последующие за именем функции аргументы передаются функции с указанным именем, в той же последовательности
слева направо. После работы возвращаемое функцией модуля zdll значение возвращается функцией $zdll в среду выполнения.
Передавать все фактические аргументы можно только как значения,
нельзя пропускать или передавать по ссылке.
В случае если функция модуля ZDLL возвращает не нулевое значение, функция $zdll генерирует ошибку <FUNCTION>.
Программисту модуля ZDLL предоставлены средства обращения к
среде исполнения процесса MiniM во время выполнения компилированного кода dll, поэтому при разработке кода на языке М следует учитывать, что какие-то значения переменных или состояние среды исполнения могут быть изменены модулем ZDLL. Также модуль ZDLL может
получить доступ к значениям, не переданным в качестве фактических
параметров функции $zdll.
6.28. $ZLASCII
243
Подробное руководство по написанию модулей ZDLL содержится в
отдельном руководстве minimadv.pdf. Примеры написания и использования модулей содержатся в подкаталоге zdll.
6.27
$ZEXP
Возвращает e (основание натуральных логарифмов), возведённое в указанную степень.
Синтаксис
$ZEXP(Число)
Определение
Произвольное выражение, вычисляемое как число.
Число
Дополнения.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Пример:
TEMP>w $zexp(1)
2.71828182845905
6.28
$ZLASCII
Возвращает десятичное значение последовательности из четырёх символов.
Синтаксис
$ZLA[SCII](Строка{,Позиция})
Определение
Строка
Позиция
Любое символьное выражение.
Целочисленное выражение, определяющее относительное расположение символов в Строке.
Функция $zlascii возвращает целочисленное значение, которое яв-
244
ГЛАВА 6. Z - ФУНКЦИИ
ляется десятичным эквивалентом четырёх символов. Десятичное значение преобразуется из кодов ASCII символов в Строке в определённой
Позиции. Если позиция не указана, то она подразумевается равной 1.
Функция выдаст значение, равное -1, если строка пуста, если значение
Позиции меньше 1, или если, начиная с запрошенной позиции, не присутствуют 4 символа полностью.
Функция $zlascii может быть представлена по формуле:
$zla(str,pos) = $a(str,pos) + ( $a(str,pos+1) * 256 ) + ( $a(str,pos+2)
* 256 * 256) + ( $a(str,pos+3) * 256 * 256 * 256 )
Примеры:
TEMP>w $zla("123456")
875770417
TEMP>w $zla("123456",3)
909456435
TEMP>w $a(3)+($a(4)*256)+($a(5)*65536)+($a(6)*16777216)
909456435
TEMP>w $zla("123456",5)
-1
TEMP>w $zla("123456",-2)
-1
TEMP>w $zla("")
-1
6.29
$ZLCHAR
Возвращает четырёхсимвольную строку, вычисленную на основании аргумента.
Синтаксис
$ZLC[HAR](Целое)
Определение
Целое
Целочисленное значение, которое является десятичным значением требуемых символов.
Функция $zlchar возвращает строку из четырёх символов, символы
вычисляются на основании значения аргумента Целое. Если аргумент
меньше 0, или больше или равно, чем 256 ∗ 256 ∗ 256 ∗ 256 = 4294967296,
6.31. $ZLN
245
то функция возвращает пустую строку.
Функция $zlchar может быть представлена формулой:
$zlc(n) = $c(n#256,n\256#256,n\(256**2)#256,n\(256**3))
Примеры:
TEMP>w $zla("abcd")
1684234849
TEMP>w $zlc($zla("abcd"))
abcd
TEMP>w $zlc(-3)
TEMP>
6.30
$ZLCASE
Переводит все символы аргумента в нижний регистр.
Синтаксис
$ZLCASE(expr)
Определение
Вычисляемое выражение.
expr
Функция $zlcase возвращает значение, равное своему аргументу с
переводом всех символов строки в нижний регистр. Перевод регистра
производится по текущему используемому nat файлу определения символов.
Примеры:
TEMP>w $zlcase("MiniM")
minim
TEMP>w $zlcase("Ёжик")
ёжик
6.31
$ZLN
Возвращает натуральный логарифм указанного числа.
246
ГЛАВА 6. Z - ФУНКЦИИ
Синтаксис
$ZLN(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Вызов функции от 0 или отрицательного числа приводит к ошибке.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Примеры:
TEMP>w $zln(0)
<ILLEGAL VALUE>
TEMP>w $zln(-4)
<ILLEGAL VALUE>
TEMP>w $zln(4)
1.38629436111989
TEMP>w $zln("asd")
<ILLEGAL VALUE>
TEMP>w $zln(1)
0
TEMP>w $zln($zexp($zpi))
3.14159265358979
6.32 $ZLOG
Возвращает десятичный логарифм указанного числа.
Синтаксис
$ZLOG(Число)
Определение
Число
Дополнения.
Произвольное выражение, вычисляемое как число.
6.33. $ZLOWER
247
Вызов функции от 0 или отрицательного числа приводит к ошибке.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Примеры:
TEMP>w $zlog(0)
<ILLEGAL VALUE>
TEMP>w $zlog(-4)
<ILLEGAL VALUE>
TEMP>w $zlog(1)
0
TEMP>w $zlog(10)
1
6.33
$ZLOWER
Переводит все символы аргумента в нижний регистр.
Синтаксис
$ZLOWER(expr)
Определение
expr
Вычисляемое выражение.
Функция $zlower возвращает значение, равное своему аргументу с
переводом всех символов строки в нижний регистр. Перевод регистра
производится по текущему используемому nat файлу определения символов.
Примеры:
TEMP>w $zlower("MiniM")
minim
TEMP>w $zlower("Ёжик")
ёжик
248
ГЛАВА 6. Z - ФУНКЦИИ
6.34 $ZPCREMATCH
Проверяет соответствие строки заданному регулярному выражению.
Синтаксис
$ZPCREMATCH(str,regexp[,options])
$ZPCREM(str,regexp[,options])
Определение
str
regexp
options
Вычисляемое выражение, значение которого следует
проверить на соответствие регулярному выражению
Регулярное выражение
Опции сопоставления, необязательный параметр
Функция $zpcrematch проверяет соответствие значения выражения
str регулярному выражению regexp. Значение regexp может быть задано произвольным вычисляемым выражением. Опции options задают
уточнение характера сопоставления. Если параметр options опущен, то
подразумевается его значение равное пустой строке. Функция возвращает значение 1 если значение str полностью соответствует регулярному
выражению regexp, иначе возвращается значение 0. При синтаксической ошибке в заданном регулярном выражении генерируется ошибка
<PCRE>.
Значение options рассматривается как набор символов, нечувствительно к регистру. Значения символов в аргументе options описывается
в разделе документации Регулярные выражения, подраздел Опции регулярных выражений. Синтаксис регулярных выражений описывается
в разделе документации Регулярные выражения, подраздел Синтаксис
регулярных выражений.
Примеры:
USER>w $zpcrematch("one two","(\w+) (\w+)")
1
USER>w $zpcrematch("one two three","(\w+) (\w+)")
0
6.35. $ZPCREREPLACE
6.35
249
$ZPCREREPLACE
Выполняет замену в строке подстрок, соответствующих регулярному выражению.
Синтаксис
$ZPCREREPLACE(str,regexp,with[,options])
$ZPCRER(str,regexp,with[,options])
Определение
str
regexp
with
options
Вычисляемое выражение, в котором надо заменить
подстроки
Регулярное выражение
На что следует заменить найденные подстроки
Опции сопоставления, необязательный параметр
Функция $zpcrereplace выполняет поиск подстрок в значении str, соответствующих регулярному выражению regexp. Если в значении options
присутствует модификатор "G" то выполняется замена всех найденных
вхождений, если нет то только первого.
Функция выполняет замену найденных подстрок на значение заданное параметром with. Если в значении options присутствует модификатор
"P", то значение with рассматривается как строка содержащая псевдопеременные поиска. В случае если они присутствуют в with, то производится их подстановка.
Псевдопеременные в with формируются экранирующим символом "$".
Правила экранирования:
$$
$NNN
${NNN}
Выводится один символ $
Последовательность NNN из цифр рассматривается
как номер псевдопеременной
Иная последовательность после символа экранирования выводится
как есть. Номера псевдопеременных начинаются от 1. Символы { и }
позволяют явно указать где заканчивается номер всевдопеременной и
отделить его от возможно следующих после него цифр.
В псевдопеременные попадают части строки str, соответствующие частям регулярного выражения, заключенным в круглые скобки.
250
ГЛАВА 6. Z - ФУНКЦИИ
Значение options рассматривается как набор символов, нечувствительно к регистру. Значения символов в аргументе options описывается
в разделе документации Регулярные выражения, подраздел Опции регулярных выражений. Синтаксис регулярных выражений описывается
в разделе документации Регулярные выражения, подраздел Синтаксис
регулярных выражений.
Примеры:
Однократная замена с применением псевдопеременных:
USER>s re="(\w+) (\w+)"
USER>s str="**one two##three four"
USER>w $zpcrer(str,re,"-=$2 + $1=-","p")
**-=two + one=-##three four
Многократная замена с применением всевдопеременных:
USER>s re="(\w+) (\w+)"
USER>s str="**one two##three four+++"
USER>w $zpcrer(str,re,"-=${2}22 + $1=-","pg")
**-=two22 + one=-##-=four22 + three=-+++
Многократная замена без применения псевдопеременных:
USER>s re="(\w+) (\w+)"
USER>s str="**one two##three four+++"
USER>w $zpcrer(str,re,"-=${2}22 + $1=-","g")
**-=${2}22 + $1=-##-=${2}22 + $1=-+++
При синтаксической ошибке в регулярном выражении генерируется
ошибка <PCRE>. При невозможности построить результат из-за ограничения максимальной поддерживаемой MiniM строки генерируется ошибка <MAXSTRING>.
6.36. $ZPCRESEARCH
6.36
251
$ZPCRESEARCH
Отыскивает в строке подстроки соответствующие регулярному выражению.
Синтаксис
$ZPCRESEARCH(str,regexp[,options])
$ZPCRES(str,regexp[,options])
Определение
str
regexp
options
Вычисляемое выражение, в значении которого нужно
найти подстроки
Регулярное выражение
Опции сопоставления, необязательный параметр
Функция $zpcresearch отыскивает в значении str одно или все вхождения подстрок соответствующие указанному регулярному выражению. Если в значении options присутствует символ "G", то выполняется поиск всех вхождений, а если отсутствует, то только первого. При
синтаксической ошибке в заданном регулярном выражении генерируется
ошибка <PCRE>. Функция $zpcresearch возвращает найденные подстроки в виде списка в формате функции $listbuild. В случае, если не найдено ни одного вхождения, возвращается пустая строка. В получаемом
списке найденные подстроки следуют в порядке их отыскания регулярным выражением.
Значение options рассматривается как набор символов, нечувствительно к регистру. Значения символов в аргументе options описывается
в разделе документации Регулярные выражения, подраздел Опции регулярных выражений. Синтаксис регулярных выражений описывается
в разделе документации Регулярные выражения, подраздел Синтаксис
регулярных выражений.
Примеры:
USER>s re="(\w+) (\w+)"
USER>s str="one two three four five six seven"
USER>s found=$zpcresearch(str,re,"g")
252
ГЛАВА 6. Z - ФУНКЦИИ
USER>f i=1:1:$ll(found) w $lg(found,i),!
one two
three four
five six
6.37
$ZPOWER
Возвращает число, возведённое в указанную степень.
Синтаксис
$ZPOWER(Основание,Показатель)
Определение
Основание
Показатель
Выражение, приводимое к числу.
Выражение, приводимое к числу.
Дополнения.
Результатом выполнения функции будет Основание, возведённое в
степень Показатель.
Результат выполнения функции полностью аналогичен оператору **
в форме
$zpower(x,y)=x**y
Если Основание равно нулю, Показатель должен быть положительным.
Если Основание отрицательно, Показатель должен быть целым.
Примеры:
TEMP>w $zpower(2,10)
1024
TEMP>w $zpower(2,-0.5)
.707106781186548
6.38
$ZPREVIOUS
Возвращает предыдущий имеющийся индекс переменной.
Синтаксис
6.38. $ZPREVIOUS
253
$ZP[REVIOUS](name)
Определение
name
Локальная, глобальная или структурная системная
переменная.
Функция $zprevious() примененная к локальной, глобальной или
структурной системной переменной, возвращает предыдущий имеющийся индекс в индексной сортировке. Если предыдущий индекс не существует, функция возвращает пустую строку. По своему поведению функция $zprevious() выполнена как полный эквивалент более современной
функции $order() с вторым аргументом -1.
USER>s a(1)=1,a(2)=2
USER>w $zp(a(""))
2
USER>w $zp(a(2))
1
USER>w $zp(a(1))
USER>
Если функция $zprevious() применяется к глобальной переменной,
у функции имеется side effect, изменяется индикатор голой ссылки. Если предыдущий индекс существует, функция изменяет индикатор голой
ссылки в это сущестующее имя, иначе функция изменяет значение индикатора голой ссылки в исходное имя указанное в аргументе, даже если
оно не существует в базе.
Если аргумент name указывает глобальную переменную с полной
ссылкой включающей имя базы данных, индикатор голой ссылки также
взводится в значение содержащее имя базы данных.
Возвращаемое значение функции $zprevious() с структурной системной переменной зависит от смысла этой переменной, но полностью эквивалентно применению функции $order() с вторым аргументом -1.
Функция $zprevious() была поддержана для совместимости с наследованным программным обеспечением на языке MUMPS, использвавшим её.
254
6.39
ГЛАВА 6. Z - ФУНКЦИИ
$ZQASCII
Возвращает десятичное значение последовательности из восьми символов.
Синтаксис
$ZQA[SCII](Строка{,Позиция})
Определение
Строка
Позиция
Любое символьное выражение.
Целочисленное выражение, определяющее относительное расположение символов в Строке.
Функция $zqascii возвращает целочисленное значение, которое является десятичным эквивалентом восьми символов. Десятичное значение преобразуется из кодов ASCII символов в Строке в определённой
Позиции. Если позиция не указана, то она подразумевается равной 1.
Функция выдаст значение, равное -1, если строка пуста, если значение
Позиции меньше 1, или если, начиная с запрошенной позиции, не присутствуют 8 символов полностью.
Функция $zqascii может быть представлена по формуле:
$zqa(str,pos) = $a(str,pos) + ( $a(str,pos+1) * 256 ) + ( $a(str,pos+2)
* 256 * 256 * 256) + ( $a(str,pos+3) * 256 * 256 * 256 ) + ( $a(str,pos+4)
* 256 * 256 * 256 * 256 * 256 ) + ( $a(str,pos+5) * 256 * 256 * 256 * 256
* 256 * 256 ) + ( $a(str,pos+6) * 256 * 256 * 256 * 256 * 256 * 256 * 256
) + ( $a(str,pos+7) * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 )
Примеры:
TEMP>w $zqa("123456")
-1
TEMP>w $zqa("123456789")
4050765991979987505
TEMP>w $zqa("123456789",2)
4123106164818064178
TEMP>w $zqa("123456789",-5)
-1
TEMP>w $zqa("123456789",5)
-1
6.40. $ZQCHAR
255
Примечание: в системе MiniM максимальную разрядность целых чисел
реализует тип 64-битное со знаком. Поэтому требуется некоторое внимание программиста при работе с большими числами. Часть больших
чисел выводится как отрицательные, хотя функции $zqa и $zqc работают с ними как с положительными, работая со знаковым разрядом 64-х
битного числа как со значащим, а не как со знаковым.
TEMP>w $zqa("интернет")
-944086927958413848
TEMP>w $zqc($zqa("интернет"))
интернет
Для арифметических операций максимальным целым числом является:
TEMP>w 256*256*256*256*256*256*256*127
9151314442816847872
6.40
$ZQCHAR
Возвращает восьмисимвольную строку, вычисленную на основании аргумента.
Синтаксис
$ZQC[HAR](Целое)
Определение
Целое
Целочисленное значение, которое является десятичным значением требуемых символов.
Функция $zqchar возвращает строку из восьми символов, символы
вычисляются на основании значения аргумента Целое. Отрицательные
значения аргумента используются как представление дополнений до полного 64-х битного числа без знака. Функция $zqchar, в отличие от функций $char, $zwchar, $zlchar, не возвращает пустую строку.
Функция $zqchar может быть представлена формулой:
$zqc(n) = $c(n#256,n\256#256,n\(256**2)#256,n\(256**3),
n\(256**4),n\(256**5),n\(256**6),n\(256**7))
256
ГЛАВА 6. Z - ФУНКЦИИ
Примеры:
TEMP>zzdump $zqc(1234567890123)
0000: CB 04 FB 71 1F 01 00 00
TEMP>w $zqc(-1)
яяяяяяяя
Примечание: в системе MiniM максимальную разрядность целых чисел
реализует тип 64-битное со знаком. Поэтому требуется некоторое внимание программиста при работе с большими числами. Часть больших
чисел выводятся как отрицательные, хотя функции $zqa и $zqc работают с ними как с положительными, работая со знаковым разрядом 64-х
битного числа как со значащим, а не как со знаковым.
TEMP>w $zqa("интернет")
-944086927958413848
TEMP>w $zqc($zqa("интернет"))
интернет
Для арифметических операций максимальным целым числом является:
TEMP>w 256*256*256*256*256*256*256*127
9151314442816847872
6.41
$ZQUOTE
Возвращает строку, являющуюся текстовым представлением строки.
Синтаксис
$ZQUOTE(expr)
Определение
expr
Значение выражения, для которого требуется получить текстовое представление.
Функция $zquote возвращает строку, являющуюся текстовым представлением строки. Результат приводится к виду, допускающему его использование как есть в программном коде для задания аргумента. При
6.42. $ZSEC
257
необходимости функция $zquote использует двойные кавычки, символы оператора конкатенации и текстовое представление функции $char
для непечатных символов. Символы с кодами больше 127 считаются печатными и отображаются как есть. Функция $zquote учитывает, что
функция $char ограничена по количеству аргументов.
Примеры:
TEMP>w $zquote("интернет")
"интернет"
TEMP>w $zquote("интернет"_$c(1,2,3)_""" quote")
"интернет"_$C(1,2,3)_""" quote"
TEMP>w $zquote(123456)
123456
TEMP>w $zquote($zlc(123456))
"@в"_$C(1,0)
TEMP>zzdump $zlc(123456)
0000: 40 E2 01 00
6.42
$ZSEC
Возвращает секанс числа, выраженного в радианах.
Синтаксис
$ZSEC(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Секанс вычисляется для чисел в диапазоне от -π до π (может быть
применена системная переменная $ZPI), все остальные числа приводятся к этому диапазону.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
В связи с конечной точностью представления десятичных чисел, вызов $zsec($zpi/2) и т.п. не приводит к ошибке.
Примеры:
TEMP>w $zsec($zpi/4)
1.41421356237309
258
6.43
ГЛАВА 6. Z - ФУНКЦИИ
$ZSIN
Возвращает синус числа, выраженного в радианах.
Синтаксис
$ZSIN(Число)
Определение
Произвольное выражение, вычисляемое как число.
Число
Дополнения.
Синус вычисляется для чисел в диапазоне от -π до π (может быть
применена системная переменная $ZPI), все остальные числа приводятся к этому диапазону.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Примеры:
>w $zsin(-3*$zpi/4)
-.7071067811865475242
Примечание: вычисления производятся с плавающей точкой, поэтому следует обращать внимание на то, что компьютерные вычисления и
вычисления в математике совпадают лишь с некоторой погрешностью.
TEMP>w $zsin($zpi)
1.22460635382238E-16
6.44
$ZSQR
Возвращает квадратный корень из числа.
Синтаксис
$ZSQR(Число)
Определение
Число
Дополнения.
Произвольное выражение, вычисляемое как число.
6.45. $ZTAN
259
Вызов функции $zsqr от отрицательного числа приводит к ошибке.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
Примеры:
TEMP>w $zsqr(4)
2
TEMP>w $zsqr(-4)
<ILLEGAL VALUE>
TEMP>w $zpower(2,0.5)=$zsqr(2)
1
6.45
$ZTAN
Возвращает тангенс числа, выраженного в радианах.
Синтаксис
$ZTAN(Число)
Определение
Число
Произвольное выражение, вычисляемое как число.
Дополнения.
Тангенс вычисляется для чисел в диапазоне от -π до π (может быть
применена системная переменная $ZPI), все остальные числа приводятся к этому диапазону.
Результат возвращается в канонической форме вне зависимости от
вида подаваемого на вход Числа.
В связи с конечной точностью представления десятичных чисел, вызов $ztan($zpi/2) и т.п. не приводит к ошибке.
Примеры:
TEMP>w $ztan($zpi/2)
1.63317787283838E+16
TEMP>w $ztan($zpi/4)
1
260
ГЛАВА 6. Z - ФУНКЦИИ
6.46
$ZTIME
Преобразует время из формата $horolog в строковое представление по
одному из заданных форматов.
Синтаксис
$ZT[IME](Value[,Format])
Определение
Value
Format
Целочисленное выражение, время в формате
$horolog, вторая его часть, обозначающая число
секунд, прошедших с начала дня.
Целочисленное выражение, номер используемого
формата. Параметр необязателен. Если не указан, используется значение по умолчанию 1.
Значение параметра Value допустимо от 0 до 86400. При выходе значения Value за пределы этого диапазона генерируется ошибка <ILLEGAL
VALUE>.
Значение параметра Format задаёт один из видов форматирования
времени:
1
2
3
4
HH:MM:SS
HH:MM
HH:MM:SS(AM/PM)
HH:MM(AM/PM)
24-х часовой отсчет времени
24-х часовой отсчет времени
12-ти часовой отсчет времени
12-ти часовой отсчет времени
Суффиксы обозначения отсчета: AM - время до полудня, PM - время
после полудня.
Пример:
USER>w $zt(12345,1)
03:25:45
USER>w $zt(12345,2)
03:25
USER>w $zt(12345,3)
03:25:45AM
USER>w $zt(12345,4)
03:25AM
6.47. $ZTIMEH
261
При задании недопустимого значения Format генерируется ошибка
<FUNCTION>.
Используемые разделители не зависят от локальных настроек пользователя, под которым стартует сервис MiniM. Часы, минуты и секунды
выводятся всегда с двумя знаками с дополнением, лидирующим нулем
при необходимости.
Для использования второй части $horolog при форматировании времени нужно использовать функцию $piece. Например:
w $ztime($piece($horolog,",",2))
6.47
$ZTIMEH
Преобразует время из форматированной в строковом представлении по
одному из заданных форматов в значение в формате $horolog.
Синтаксис
$ZTIMEH(Value[,Format])
$ZTH(Value[,Format])
Определение
Value
Format
Строковое форматированное представление времени
в одном из поддерживаемых форматов.
Целочисленное выражение, номер используемого
формата. Параметр необязателен. Если не указан, используется значение по умолчанию 1.
При задании недопустимых значений часов, минут и секунд генерируется ошибка <ILLEGAL VALUE>.
Значение параметра Format задаёт один из видов форматирования
времени:
1
2
3
4
HH:MM:SS
HH:MM
HH:MM:SS(AM/PM)
HH:MM(AM/PM)
24-х часовой отсчет времени
24-х часовой отсчет времени
12-ти часовой отсчет времени
12-ти часовой отсчет времени
Суффиксы обозначения отсчета: AM - время до полудня, PM - время
после полудня.
262
ГЛАВА 6. Z - ФУНКЦИИ
При задании недопустимого значения Format генерируется ошибка
<FUNCTION>.
Используемые разделители не зависят от локальных настроек пользователя, под которым стартует сервис MiniM. Часы, минуты и секунды
можно задавать без дополнения лидирующим нулём.
6.48
$ZUCASE
Переводит все символы аргумента в верхний регистр.
Синтаксис
$ZUCASE(expr)
Определение
Вычисляемое выражение.
expr
Функция $zucase возвращает значение, равное своему аргументу с
переводом всех символов строки в верхний регистр. Перевод регистра
производится по текущему используемому nat файлу определения символов.
Пример:
TEMP>w $zucase("MiniM")
MINIM
TEMP>w $zucase("Ёжик")
ЁЖИК
6.49
$ZUPPER
Переводит все символы аргумента в верхний регистр.
Синтаксис
$ZUPPER(expr)
Определение
expr
Вычисляемое выражение.
Функция $zupper возвращает значение, равное своему аргументу, с
6.50. $ZVERSION
263
переводом всех символов строки в верхний регистр. Перевод регистра
производится по текущему используемому nat файлу определения символов.
Пример:
TEMP>w $zupper("MiniM")
MINIM
TEMP>w $zupper("Ёжик")
ЁЖИК
6.50
$ZVERSION
Функция возвращает отдельные значения версии продукта.
Синтаксис
$ZV[ERSION](Part)
Определение
Part
Номер части описания версии продукта.
Функция возвращает отдельные значения, описывающие версию продукта - битность, целевую операционную систему, имя продукта и другие
в зависимости от номера, указанного в арументе.
Возвращаемые значения:
Part
0
1
2
3
4
5
Возвращаемое значение
Номер версии продукта, например 1.15
Название продукта, например MiniM или MiniMono
или другое.
Целевая операционная система, для которой собран
продукт, например Windows или Linux, или другое.
Битность продукта - 32, 64 или другое.
Тип сборки продукта - release, debug, test, или другое.
Архитектура целевого процессора - i386, x64 или
другое.
Например, при использовании MiniM для Windows в 32 - битной
264
ГЛАВА 6. Z - ФУНКЦИИ
сборке значения будут такие:
USER>w $zv(0)
1.15
USER>w $zv(1)
MiniM
USER>w $zv(2)
Windows
USER>w $zv(3)
32
6.51
$ZWASCII
Возвращает десятичное значение последовательности из двух символов.
Синтаксис
$ZWA[SCII](Строка{,Позиция})
Определение
Строка
Позиция
Любое символьное выражение.
Целочисленное выражение, определяющее относительное расположение символов в Строке.
Функция $zwacsii возвращает целочисленное значение, которое является десятичным эквивалентом двух символов. Десятичное значение
преобразуется из кодов ASCII символов в Строке в определённой Позиции. Если позиция не указана, то она подразумевается равной 1. Функция выдаст значение, равное -1, если строка пуста, если значение Позиции меньше 1, или если, начиная с запрошенной позиции, не присутствуют 2 символа полностью.
Функция $zwascii может быть представлена по формуле:
$zwa(str,pos) = $a(str,pos) + ( $a(str,pos+1) * 256 )
Примеры:
TEMP>w $zwa("")
-1
TEMP>w $zwa("123456")
12849
TEMP>w $a("1")+($a(2)*256)
6.52. $ZWCHAR
265
12849
TEMP>w $zwa("123456",4)
13620
TEMP>w $a("4")+($a("5")*256)
13620
TEMP>w $zwa("123456",-1)
-1
TEMP>w $zwa("123456",-5)
-1
TEMP>w $zwa("123456",8)
-1
6.52
$ZWCHAR
Возвращает двухсимвольную строку, вычисленную на основании аргумента.
Синтаксис
$ZWC[HAR](Целое)
Определение
Целое
Целочисленное значение, которое является десятичным значением требуемых символов.
Функция $zwchar возвращает строку из двух символов, символы
вычисляются на основании значения аргумента Целое. Если аргумент
меньше 0, или больше или равно, чем 256 ∗ 256 = 65536, то функция
возвращает пустую строку.
Функция $zwchar может быть представлена формулой:
$zwc(n) = $c(n#256,n\256)
Примеры:
TEMP>w $zwc(25185)
ab
TEMP>w $zwc(2518500)
TEMP>w $zwc(-456)
266
TEMP>
TEMP>w $zwc(123)
{
TEMP>zzdump $zwc(123)
0000: 7B 00
ГЛАВА 6. Z - ФУНКЦИИ
Глава 7
Системные переменные
7.1
$DEVICE
Предназначена для хранения статуса текущего устройства.
Синтаксис
$DEVICE
$D
Системная переменная $device предназначена для хранения статуса
текущего устройства. Значение $device при старте процесса равно пустой строке.
При ошибках ввода - вывода MiniM никак не использует эту переменную. Переменная предназначается программистам. Рекомендуемый
стандартом формат - строка, разделённая запятыми:
stderr,usererr,explanation
stderr
usererr
explanation
Код ошибки ввода-вывода, соответствующий стандарту.
Пользовательский код ошибки.
Текстовое пояснение ошибки.
Переменная $device может быть установлена командой set.
Пример:
TEMP>w $d
267
268
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
TEMP>s $d=123456
TEMP>w $d
123456
7.2 $HOROLOG
Возвращает значение даты и локального времени в виде двух чисел.
Синтаксис
$HOROLOG
$H
Переменная $horolog возвращает значение даты и локального времени в виде двух чисел. Формат представления:
Число дней, прошедших с 31 декабря 1840 года
Запятая
Число секунд с начала суток по локальному времени.
Первый день - 1 января 1841 года. Представление даты переменной
$horolog стандартизовано и используется как стандартное представление
большинством программ. Пример:
TEMP>w $h
60987,56260
Для разделения даты и времени используют функцию $piece. Например:
TEMP>s h=$h w $p(h,",",1),!,$p(h,",",2)
60987
56348
Формат представления даты и времени системной переменной $horolog
является основным для системных функций работы с датой и временем
$zd, $zt, $zdh, $zth, и аналогичный формат используется системной
переменной $ztimestamp.
Программистам обязательно нужно учитывать, что два последовательных обращения к переменной $horolog могут вернуть различные
значения, независимо от производительности компьютера. Для того, чтобы работать с парой дата-время согласованно, нужно получить значение
7.3. $ECODE
269
$horolog 1 раз, после чего из полученного значения использовать отдельно дату и время. Иначе может возникнуть ошибка, если первое
обращение к переменной $horolog произойдет до полуночи, а второе после полуночи. Чтобы использовать только первую часть - значение даты, можно использовать унарный оператор +, который автоматически по
правилам языка MUMPS отбросит нечисловую часть:
TEMP>w $h
60987,56598
TEMP>w +$h
60987
7.3
$ECODE
Возвращает строку с последними произошедшими ошибками.
Синтаксис
$ECODE
$EC
При чтении системная переменная $ecode возвращает строку с последними произошедшими в процессе ошибками. Ошибки представляются через разделитель запятую, как рекомендовано стандартом. Коды
ошибок, соответствующие стандарту, начинаются на символ M, коды
ошибок разработчика М системы начинаются на Z, пользовательские
коды ошибок рекомендуется начинать с символа U. Остальные символы
формально зарезервированы стандартом.
Если происходит ошибка, описанная в стандарте, то MiniM пишет
символ M, за которым следует код ошибки по стандарту.
Пример:
TEMP>s $ec=""
TEMP>w a
<UNDEFINED>
TEMP>w b
<UNDEFINED>
TEMP>w $ec,!,$ze
270
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
,M6,M6,
<UNDEFINED>
Если обнаруживается ошибка, не предусмотренная стандартом, то
MiniM пишет символ Z, за которым в угловых скобках пишет строку
ошибки MiniM.
Пример:
TEMP>s $ec=""
TEMP>f
<INTERRUPT>
TEMP>w $ec,!,$ze
,Z<INTERRUPT>,
<INTERRUPT>
При присваивании системной переменной $ecode строки эта строка заносится в значение $ecode, в значение $zerror заносится строка
<ECODETRAP>, и генерируется ошибка <ECODETRAP>.
Пример:
TEMP>s $ec="abcd"
<ECODETRAP>
TEMP>w $ec,!,$ze
abcd
<ECODETRAP>
TEMP>s $ec=""
TEMP>w $ec,!,$ze
<ECODETRAP>
При присваивании системной переменной $ecode пустой строки её
значение устанавливается в пустую строку, системная переменная $zerror
не изменяет значение, и ошибка <ECODETRAP> не генерируется.
Значение системной переменной $ecode существует в единственном
экземпляре для процесса, и оно не может быть различным на разных
уровнях стека.
7.4. $ESTACK
7.4
271
$ESTACK
Содержит номер текущего уровня стека.
Синтаксис
$ESTACK
$ES
Переменная $estack возвращает номер текущего уровня стека. При
старте процесса номер уровня равен нулю. При создании нового уровня
стека значение $estack увеличивается на единицу.
При выходе из уровня стека значение $estack возвращается в то
значение, которое было на том уровне стека.
Значение $estack может быть обнулено командой:
new $estack
При этом, значение $estack принимает нулевое значение, и при возврате на предыдущий уровень стека значение возвращается в то, которое
было.
Значение переменной $estack не может быть присвоено командой set.
Отличие системной переменной $estack от системной переменной
$stack в том, что значение $estack может быть обнулено командой new, и
при возврате на предыдущий уровень стека значение восстанавливается.
7.5
$ETRAP
Содержит строку команд с текущим обработчиком ошибки.
Синтаксис
$ETRAP
$ET
Переменная $etrap содержит строку команд, которая вызывается в
качестве обработчика ошибок, если они генерируются каким-либо способом.
Значение $etrap может содержать только одну строку.
При старте процесса значение $etrap - пустая строка.
Значение переменной $etrap может быть присвоено командой set. При
этом синтаксическая корректность на этапе присваивания не проверяется.
272
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Системная переменная $etrap имеет собственное значение на каждом
уровне стека. При создании нового уровня стека значение $etrap берётся
от предыдущего уровня.
Значение переменной $etrap может быть создано на текущем уровне
стека командой new, при этом значение $etrap копируется из предыдущего уровня либо присваивается, если используется инициализирующая
форма команды new.
Примеры:
TEMP>s $et="w !123,!"
TEMP>n $et
TEMP>w $et
w !123,!
TEMP>n $et="789"
TEMP>w $et
789
TEMP>
При возврате управления на предыдущий уровень стека значение переменной $etrap восстанавливается в то значение, которое было на этом
уровне стека.
При срабатывании обработчика ошибок значение переменной $etrap
выполняется как строка команд.
7.6
$IO
Возвращает строку идентификации текущего устройства ввода-вывода.
Синтаксис
$IO
$I
Переменная $io возвращает строку идентификации текущего устройства ввода-вывода. После смены текущего устройства результат $io соответственно изменяется на новое значение, в отличие от значения $principal.
Смена текущего устройства может производиться командой use, командой close - при закрытии текущего устройства (MiniM автоматически
7.7. $JOB
273
переключает текущее устройство на $principal) и при выходе в интерактивный шелл в консольном или telnet режиме.
Пример:
TEMP>s dev="|NULL|123" o dev u dev s d=$io s p=$p c dev
TEMP>w
d="|NULL|123"
dev="|NULL|123"
p="|CON|"
TEMP>w $i
|CON|
7.7
$JOB
Возвращает номер текущего процесса.
Синтаксис
$J[OB]
Переменная $job всегда возвращает номер текущего процесса, и он
не изменяется в течение всего времени его существования. В один момент все процессы одной системы MiniM имеют различные номера. При
старте процесса ему присваивается номер, отличный от уже имеющихся
в системе. После завершения процесса его номер может быть использован для другого процесса повторно.
Пример:
TEMP>w $j
1608
MiniMono difference
MiniM Database Server в качестве значения $job возвращает номер
процесса Windows, а MiniM Embedded Edition возвращает номер потока.
274
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
7.8 $KEY
Содержит информацию об окончании чтения.
Синтаксис
$KEY
$K
Системная переменная $key содержит строку, указывающую, чем закончилась команда чтения. Для каждого устройства ввода-вывода система MiniM поддерживает собственное значение этой переменной, и
переменная $key показывает индикатор окончания чтения для текущего
устройства.
При работе в интерактивном режиме значение переменной $key может быть перезаписано при вводе символов оператором. Обычно, ввод
строки команд заканчивается символом возврата каретки, поэтому с этого значения $key начинается выполнение строки команд в интерактивных режимах.
Пример:
TEMP>r s s k=$k w ! zzdump k
ww
0000: 0D
Если чтение строки закончено по чтению терминатора, то переменная
$key содержит значение терминатора.
Если чтение закончено по тайм-ауту, то переменная $key содержит
пустую строку ("").
При чтении символа (read *ch) переменная $key содержит сам символ. Это поведение не специфицировано стандартом и является расширением MiniM.
Значение переменной $key может быть присвоено командой set. Присвоение значения выполняется только для текущего устройства вводавывода. Присвоенное значение сохраняется до очередной операции чтения из этого устройства.
7.9 $PRINCIPAL
Возвращает строку идентификации устройства ввода-вывода по умолчанию.
7.10. $QUIT
275
Синтаксис
$PRINCIPAL
$P
Переменная $principal возвращает строку идентификации устройства
ввода-вывода по умолчанию. Устройство ввода-вывода по умолчанию
создаётся для любого процесса MiniM и существует в течение всего
времени жизни процесса. Оно не может быть закрыто или изменено.
Переключение на устройство ввода-вывода по умолчанию производится автоматически при выходе в интерактивный шелл для консольного и
telnet режимов, а также при закрытии текущего устройства. Применение команды закрытия close к устройству $principal не имеет действия
и игнорируется системой MiniM без сообщения об ошибке.
Пример:
TEMP>s dev="|NULL|123" o dev u dev s d=$io s p=$p c dev
TEMP>w
d="|NULL|123"
dev="|NULL|123"
p="|CON|"
TEMP>w $i
|CON|
7.10
$QUIT
Возвращает флаг индикации, что для возврата из текущего контекста
требуется возврат значения.
Синтаксис
$QUIT
$Q
Переменная $quit возвращает флаг индикации, что для возврата из
текущего контекста требуется возврат значения. Если возврат требуется (был вызов подпрограммы как $$), то переменная $quit возвращает
значение 1, иначе (был контекст do или execute) переменная $quit возвращает значение 0.
276
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Если контекст выполнения требует возврата ($quit=1), то в нём требуется возврат командой quit с аргументом, иначе требуется возврат безаргументной формой quit.
Использование системной переменной $quit необходимо, если выполнение подпрограммы может быть вызвано как в контексте возврата, так
и без него.
7.11
$REFERENCE
Содержит имя последней глобальной ссылки.
Синтаксис
$REFERENCE
$R
Системная переменная $reference содержит имя последней глобальной ссылки, к которой обращался процесс. Также это имя называется
голой ссылкой или naked reference. Последняя ссылка при старте процесса не определена, и переменная $reference возвращает пустую строку.
Голая ссылка изменяется при обращении к глобальным именам, при
вычислении значений, при использовании команд set, kill, write, zwrite
или при вызове функций, обращающихся к глобальным именам: $data,
$order, $query, $increment.
Голая ссылка может быть изменена присваиванием значения системной переменной $reference без обращений к глобальным именам. Системной переменной может быть присвоено как корректное глобальное
имя (которое не обязано существовать и иметь данные), так и пустая
строка. Например:
TEMP>s $r="^aa"
TEMP>w $r
^aa
TEMP>s $r="^bb(123)"
TEMP>w $r
^bb(123)
TEMP>s $r=""
TEMP>w $r
7.12. $STACK
277
TEMP>
Если функции обращения к глобальному имени ($data, $order, $query,
$increment) обращались с указанием полного имени, включающего задание базы данных, то в голой ссылке также запоминается полное имя,
включая имя базы данных, иначе в голую ссылку имя базы не включается. Например:
TEMP>w $d(^|"TEMP"|aa)
0
TEMP>w $r
^|"TEMP"|aa
TEMP>w $d(^aa)
0
TEMP>w $r
^aa
TEMP>
При смене текущей базы данных значение голой ссылки автоматически присваивается пустой строке. Если новая база данных совпадает с
текущей, то никаких изменений в голой ссылке не производится.
Функция $data() при обращении к глобальной переменной всегда
изменяет значение индикатора голой ссылки, даже если в этом имени
нет данных (если возвращает значения 0 или 1).
Функции $order и $query, в случае если следующее глобальное имя
существует, изменяют значение голой ссылки на его значение, иначе
изменяют значение голой ссылки на имя, которое было задано в их
аргументе как стартовое имя итерации.
Функция $increment при успешном выполнении всегда изменяет значение голой ссылки.
Начиная с версии 1.31 системная переменная $reference может быть
ньюкнута или ньюкнута с инициализацией. При возврате управления по
стеку ее значение может быть неявно изменено на предыдущее, хотя
никаких операций с глобалами при возврате по стеку не выполняется.
7.12
$STACK
Возвращает текущий уровень стека выполнения.
Синтаксис
278
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
$STACK
$ST
Переменная $stack возвращает для текущего процесса уровень стека
выполнения в виде числа. Отсчёт начинается с нуля. При старте процесса MiniM в интерактивном режиме или в режиме построчного чтения
команд уровень стека равен 0. Уровень стека увеличивается на 1 при
создании нового контекста выполнения и уменьшается на 1 при возврате
из него.
Значение системной переменной $stack не может быть изменено присваиванием.
В отличие от системной переменной $estack значение $stack не может быть обнулено командой new.
7.13
$STORAGE
Возвращает объём памяти, доступной процессу, для локальных переменных.
Синтаксис
$STORAGE
$S
Переменная $storage возвращает объём памяти, доступной процессу,
для хранения локальных переменных. Величина возвращается в байтах.
Начальное значение $storage для процессов указывается в настроечном
файле minim.ini, секция [Process], значение Storage.
Переменная возвращает общее количество памяти, которое осталось
процессу для размещения локальных переменных. Значение является
оценочным. Поскольку процесс MiniM может фрагментировать буфер
локальных переменных. Не весь объём памяти, возвращаемый переменной $storage, может оказаться доступным для использования.
Эта память используется как для размещения значений локальных
переменных, так и для хранения их имён и контекстов имён, создаваемых командами new, xecute и вызовами подпрограмм.
Значение системной переменной $storage не может быть изменено
присваиванием в ходе выполнения процесса.
7.14. $SYSTEM
7.14
279
$SYSTEM
Возвращает строку индентификации текущей инсталляции сервера MiniM.
Синтаксис
$SY[STEM]
Переменная $system всегда возвращает строку идентификации текущей инсталляции сервера MiniM. Строка состоит из номера назначенного MDC, имени компьютера и имени инсталляции, заданным при инсталляции сервера MiniM. Значения разделяются запятой. Имя инсталляции
прописывается в конфигурационном файле minim.ini. Если на компьютере установлено несколько инсталляций MiniM, то им следует присвоить
различные имена. Ответственность за именование инсталляций лежит
на администраторе системы. Правила см. в файле minimini.pdf. Номер,
назначенный MDC, для MiniM Database Server и MiniMono равен 52,
это константа и это значение уникально среди реализаций MUMPS.
Пример:
TEMP>w $system
52,AUGUST,MINIM00
TEMP>w $sy
52,AUGUST,MINIM00
Отличие MiniMono
В MiniM Embedded Edition имя инсталляции всегда равно "MINIMONO"
и переменная $system возвращает номер MDC, имя компьютера и строку
"MINIMONO".
7.15
$TEST
Возвращает текущее значение индикатора успешности выполнения.
Синтаксис
$TEST
$T
Переменная $test возвращает текущее значение индикатора успешности выполнения операций с тайм-аутами и команды if.
280
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Команда read с тайм-аутом устанавливает значение $test в 1, если
чтение было выполнено раньше, чем истёк тайм-аут. Если чтение закончилось по истечении тайм-аута, то $test выставляется в значение 0.
Команда lock с тайм-аутом выставляет $test в значение 1, если команда выполнилась в течение указанного времени тайм-аута. Иначе команда
lock не выполняется, и значение $test устанавливается в значение 0.
Команда open с тайм-аутом выставляет $test в 1, если команда выполнилась успешно в течение указанного времени тайм-аута. Иначе команда
open устанавливает $test в значение 0.
Команда job с тайм-аутом выставляет $test в 1, если команда выполнилась успешно в течение указанного времени тайм-аута. Иначе команда
job устанавливает $test в значение 0.
Команда if устанавливает $test в значение 1, если проверка выполнилась успешно, и в значение 0, если не успешно. Безаргументная форма
команды if проверяет значение $test, поэтому его значение не изменяется.
Значение $test используется безаргументной формой команды if и
командой else. Команда else продолжает выполнение следующих за ней
команд на той же строке, если значение $test равно 0.
Значение $test не может быть присвоено командой set.
Команды в форме без тайм-аутов не изменяют значение $test. Также,
значение $test не изменяется постусловиями команд вне зависимости от
успешности их проверки. Получение значения в вычислениях выражений
не изменяет значения $test.
Значение переменной $test защищается от изменений стекованием
при вызове пользовательской функции и пользовательской переменной
($$) и при вызове безаргументной формы команды do. При вызове команды xecute и команды do с аргументами значение $test не защищается
стекованием и может быть изменено вызываемым кодом. Пример, демонстрирующий различие в стековании системной переменной $test:
run()
n tmp
w "argumentless do",!
i 1 w $t,! d w $t,!
. i 0
w "do with argument",!
i 1 w $t,! d proc w $t,!
w "xecute",!
i 1 w $t,! x "i 0" w $t,!
w "function",!
7.16. $TLEVEL
281
i 1 w $t,! s tmp=$$func() w $t,!
q
proc
i 0
q
func()
i 0
q 1
При выполнении получаем:
argumentless do
1
1
do with argument
1
0
xecute
1
0
function
1
1
При старте процесса MiniM начальное значение $test равно 0.
Переменная $test может принимать значения либо 0, либо 1 и никакие другие.
Начиная с версии 1.31 MiniM поддерживает стекование переменной
$test используя команду NEW и начиная с этой версии команда NEW
может явно присвоить значение переменной $test в форме NEW с инициализацией.
7.16
$TLEVEL
Возвращает текущий уровень транзакции текущего процесса.
Синтаксис
$TLEVEL
$TL
282
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Переменная $tlevel возвращает текущий уровень транзакции текущего процесса. Присваивание значения этой переменной невозможно.
Значение переменной изменяется на +1 командой tstart, на -1 - командой tcommit и сбрасывается в значение 0 командой trollback. При старте
процесса MiniM начальное значение переменной $tlevel равно 0. В этом
случае процесс работает вне транзакции.
Пример:
TEMP>w $tl,! ts
0
1
2
1
0
w $tl,! ts
TEMP>w $tl,! ts
0
2
0
ts
7.17
w $tl,! tc
w $tl,! tro
w $tl,! tc
w $tl,!
w $tl,!
$X
Возвращает или устанавливает координату курсора по горизонтали.
Синтаксис
$X
Системная переменная $x возвращает или, при присваивании, устанавливает координату курсора по горизонтали.
Системная переменная применяется к текущему устройству и оперирует его характеристиками.
Действие системной переменной $x распространяется на устройства
типа консоль (|CON|) и телнет (|TNT|). Для остальных устройств чтение
или запись переменной не имеет действия, всегда возвращается значение
0.
Отсчёт по горизонтали идёт от 0 по возрастанию слева направо.
Устройство консоль (|CON|)
При чтении $x процесс определяет положение курсора самостоятельно, обращаясь к Windows консоли.
7.18. $Y
283
При записи $x процесс устанавливает курсор самостоятельно, обращаясь к Windows консоли.
Устройство телнет (|TNT|)
При чтении значения возвращается внутреннее значение, вычисляемое по значениям строк, выводимыми командами read, write и zwrite.
При использовании команды
write *char
вычисление текущей позиции не производится, поэтому при использовании такой формы значение $x не гарантируется корректным.
При записи переменной $x производится формирование управляющей
эскейп-последовательности, и позиционирование курсора на устройстве
отображения возлагается на телнет-клиента. При этом во внутреннее
представление заносится полученное значение.
7.18
$Y
Возвращает или устанавливает координату курсора по вертикали.
Синтаксис
$y
Системная переменная $y возвращает или, при присваивании, устанавливает координату курсора по вертикали.
Системная переменная применяется к текущему устройству и оперирует его характеристиками.
Действие системной переменной $y распространяется на устройства
типа консоль (|CON|) и телнет (|TNT|). Для остальных устройств чтение
или запись переменной не имеет действия, всегда возвращается значение
0.
Отсчёт по вертикали идёт от 0 по возрастанию сверху вниз.
Устройство консоль (|CON|)
При чтении $y процесс определяет положение курсора самостоятельно, обращаясь к Windows консоли.
При записи $y процесс устанавливает курсор самостоятельно, обращаясь к Windows консоли.
Устройство телнет (|TNT|)
284
ГЛАВА 7. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
При чтении значения возвращается внутреннее значение, вычисляемое по значениям строк, выводимыми командами read, write и zwrite.
При использовании команды
write *char
вычисление текущей позиции не производится, поэтому при использовании такой формы значение $y не гарантируется корректным.
При записи переменной $y производится формирование управляющей
эскейп-последовательности, и позиционирование курсора на устройстве
отображения возлагается на телнет-клиента. При этом во внутреннее
представление заносится полученное значение.
Глава 8
Системные Z - переменные
8.1
$ZCHILD
Возвращает номер дочернего процесса, запущенного командой job.
Синтаксис
$ZCHILD
Переменная $zchild возвращает номер дочернего процесса, запущенного командой job. Значение переменной сохраняется до следующего выполнения команды job, вне зависимости от того, завершён ли дочерний
процесс. Если команда job не выполнила запуск дочернего процесса, то
переменная $zchild возвращает пустую строку.
Пример:
s childexist=$d(^$JOB($zchild))
8.2
$ZEOF
Возвращает индикатор конца входного потока данных.
Синтаксис
$ZEOF
Переменная $zeof возвращает индикатор конца входного потока данных. Если текущим устройством является устройство одного из типов:
|FILE|, |PIPE|, |TCP|, |STORE| то возвращается значение 1 или 0, в
зависимости от того, достигнут ли устройством конец входного потока
данных.
285
286
ГЛАВА 8. СИСТЕМНЫЕ Z - ПЕРЕМЕННЫЕ
В случае если текущим устройством является уcтройство иного типа,
системная переменная $zeof всегда возвращает значение 0.
Индикатор устанавливается, если включена поддержка zeof для текущего процесса. По умолчанию поддержка системной переменной $zeof
выключена, и при достижении конца входного потока устройствами генерируется ошибка <ENDOFFILE>.
Переключение режима использования системной переменной $zeof
или генерации ошибки <ENDOFFILE> выполняется в настройках сервера, файл minim.ini, секция Process, ключ TrapOnEof. Если значение
1, то генерируется ошибка, если значение 0, то нет. В любом случае,
взводится системная переменная $zeof, и процесс при чтении данных
должен проверять её значение.
Текущий режим обработки конца файла процессом определяется системной функцией $view("proc",5).
8.3
$ZERROR
Возвращает строку с сообщением о последней по времени произошедшей
ошибкой.
Синтаксис
$ZE[RROR]
При чтении переменной $zerror возвращается сообщение о последней
произошедшей в процессе ошибки. Текст приводится в угловых скобках.
Например:
TEMP>w abc
<UNDEFINED>
TEMP>w $ze
<UNDEFINED>
Полный перечень поддерживаемых системой MiniM сообщений об
ошибках приведён в текущем руководстве.
В отличие от системной переменной $ecode, системная переменная
$zerror не стандартизована и возвращает не список последних произошедших ошибок, а только одну последнюю произошедшую ошибку и в
формате, отличающимся от формата переменной $ecode. Приводится не
номер ошибки, а краткое именование.
Системная переменная $zerror может быть присвоена командой set.
Например:
8.4. $ZGUID
287
TEMP>w abc
<UNDEFINED>
TEMP>w $ze
<UNDEFINED>
TEMP>s $ze=""
TEMP>w $ze
TEMP>s $ze="789"
TEMP>w $ze
789
В этом случае контроль допустимости присваиваемого значения не
выполняется.
8.4 $ZGUID
Генерирует и возвращает глобальный уникальный идентификатор.
Синтаксис
$ZGUID
При каждом обращении на чтение системная переменная $zguid генерирует и возвращает глобальный уникальный идентификатор. Возвращаемое значение представляет собой GUID в стандартном представлении в шестнадцатеричном виде с разбиением на группы. Уникальность
получаемого значения обеспечивается текущей операционной системой
Windows.
Для операционной системы Linux используется генерация GUID на
основе случайных чисел.
Для операционной системы FreeBSD используется генерация GUID
средствами операционной системы.
Пример:
TEMP>w $zguid
C4DC06D9-F40D-4445-ADE6-BABC87DE25C1
288
8.5
ГЛАВА 8. СИСТЕМНЫЕ Z - ПЕРЕМЕННЫЕ
$ZHOROLOG
Возвращает количество секунд с момента старта сервера.
Синтаксис
$ZHOROLOG $ZH
При каждом обращении к системной переменной $zhorolog возвращается текущее значение времени в секундах прошедшее с момента старта
сервера. Время возвращается с точностью до микросекунд. Для измерения используется таймер высокого разрешения.
Пример:
USER>s a=$zh s b=123 s c=$zh
USER>w
a="20.931194"
b=123
c="20.931259"
8.6
$ZNAME
Возвращает имя текущей исполняемой рутины.
Синтаксис
$ZNAME
Переменная $zname возвращает имя текущей исполняемой рутины,
если исполняется рутина, либо возвращает пустую строку. Обращение
к переменной $zname полностью эквивалентно обращению к функции
$text(+0). При выполнении интерактивных процессов на верхнем уровне
стека у них нет текущей рутины, поэтому для них в этом состоянии
возвращается пустая строка.
Пример:
s curroutine=$zname
8.7. $ZNSPACE
289
8.7 $ZNSPACE
Возвращает имя текущей базы данных для текущего процесса.
Синтаксис
$ZNSPACE
Переменная $znspace возвращает имя текущей базы данных для текущего процесса. Имя базы данных возвращается в верхнем регистре.
После переключения процесса в другую базу данных эта переменная
возвращает новое значение.
Пример:
TEMP>w $znspace
TEMP
8.8 $ZPARENT
Возвращает номер процесса MiniM, который был родительским для текущего процесса.
Синтаксис
$ZPARENT
Переменная $zparent позвращает номер процесса MiniM, который
был родительским для текущего процесса. Если процесс MiniM запущен не командой job, то переменная возвращает пустую строку. Номер
процесса родителя сохраняется в течение всего времени жизни процесса,
в том числе и после завершения родительского процесса.
Пример:
s parentexist=$d(^$JOB($zparent))
MiniMono difference
В MiniM Embedded Edition переменная $zparent всегда возвращает
0.
290
8.9
ГЛАВА 8. СИСТЕМНЫЕ Z - ПЕРЕМЕННЫЕ
$ZPI
Возвращает значение константы π.
Синтаксис
$ZPI
Переменная $zpi возвращает значение константы π.
Пример:
TEMP>w $zpi
3.14159265358979
8.10
$ZREFERENCE
Содержит имя последней глобальной ссылки.
Синтаксис
$ZREFERENCE
$ZR
Системная переменная $zreference содержит имя последней глобальной ссылки, к которой обращался процесс. Также это имя называется голой ссылкой или naked reference. Последняя ссылка при старте процесса
не определена, и переменная $zreference возвращает пустую строку.
Голая ссылка изменяется при обращении к глобальным именам, при
вычислении значений, при использовании команд set, kill, write, zwrite
или при вызове функций, обращающихся к глобальным именам: $data,
$order, $query, $increment.
Голая ссылка может быть изменена присваиванием значения системной переменной $zreference без обращений к глобальным именам. Системной переменной может быть присвоено как корректное глобальное
имя (которое не обязано существовать и иметь данные), так и пустая
строка. Например:
TEMP>s $zr="^aa"
TEMP>w $zr
^aa
TEMP>s $zr="^bb(123)"
8.11. $ZTIMESTAMP
291
TEMP>w $zr
^bb(123)
TEMP>s $zr=""
TEMP>w $zr
TEMP>
Если функции обращения к глобальному имени ($data, $order, $query,
$increment) обращались с указанием полного имени, включающего задание базы данных, то в голой ссылке также запоминается полное имя,
включая имя базы данных, иначе в голую ссылку имя базы не включается. Например:
TEMP>w $d(^|"TEMP"|aa)
0
TEMP>w $zr
^|"TEMP"|aa
TEMP>w $d(^aa)
0
TEMP>w $zr
^aa
TEMP>
При смене текущей базы данных значение голой ссылки автоматически присваивается пустой строке. Если новая база данных совпадает с
текущей, то никаких изменений в голой ссылке не производится.
Функция $data() при обращении к глобальной переменной всегда
изменяет значение индикатора голой ссылки, даже если в этом имени
нет данных (если возвращает значения 0 или 1).
Функции $order и $query, в случае если следующее глобальное имя
существует, изменяют значение голой ссылки на его значение, иначе
изменяют значение голой ссылки на имя, которое было задано в их
аргументе как стартовое имя итерации.
Функция $increment при успешном выполнении всегда изменяет значение голой ссылки.
8.11
$ZTIMESTAMP
Возвращает дату и время по Гринвичу с миллисекундами.
292
ГЛАВА 8. СИСТЕМНЫЕ Z - ПЕРЕМЕННЫЕ
Синтаксис
$ZTIMESTAMP
$ZTS
Переменная $ztimestamp при каждом обращении возвращает дату и
время по Гринвичу с миллисекундами. В отличие от системной переменной $horolog переменная $ztimestamp не делает поправку на локальное
время.
Формат переменной:
число дней с 31 декабря 1840 года
запятая
число секунд с начала суток
точка
число миллисекунд с начала секунды
При формировании разрядов миллисекунд MiniM производит выравнивание вправо и дополнение нулями миллисекунд слева. Лидирующие
нули в представлении миллисекунд присутствуют, незначащие завершающие опускаются. Например:
Миллисекунды
1
10
100
Представление миллисекунд
.001
.01
.1
Примечание: программистам всегда нужно обращать внимание на то,
что следующее обращение к этой переменной может вернуть иное значение вне зависимости от быстродействия компьютера.
Пример:
TEMP>w $zts
60986,43395.485
TEMP>w $h
60986,54199
8.12 $ZTIMEZONE
Возвращает информацию о временной зоне по Гринвичу.
Синтаксис
8.13. $ZTRAP
293
$ZTIMEZONE
$ZTZ
Переменная $ztimezone возвращает информацию о временной зоне
компьютера, на котором работает текущая инсталляция MiniM. В виде
числа - смещения в минутах относительно Гринвичского меридиана. В
Москве показания $ztimezone:
TEMP>w $ztimezone
-180
TEMP>w $ztz
-180
8.13 $ZTRAP
Возвращает значение последнего установленного упрощенного обработчика ошибок.
Синтаксис
$ZTRAP $ZT
Системная переменная $ztrap возвращает значение последнего установленного обработчика ошибок. Системная переменная $ztrap имеет
одно значение для всех уровней стека и сохраняет последнее установленное значение.
Обработчик ошибок установленный через присваивание системной
переменной $ztrap не является самостоятельным отдельным механизмом обработки ошибок, а является альтернативой установке значений
системным переменным $estack и $etrap. Сам обработчик ошибок вызывается командой goto. При присваивании значения системной переменной $ztrap производится анализ его содержания и выполняются операции с присваиванием и new с системными переменными $estack и $etrap
в зависимости от содержания $ztrap.
В значении системной переменной $ztrap допускается либо имя метки для перехода по команде goto либо метка и дополнительный символ
"*" перед ней.
Если значение $ztrap при присваивании содержит только метку, то
при этом выполняется код эквивалентный коду:
new $estack
new $etrap
set $etrap="g:’$es "_$ztrap
294
ГЛАВА 8. СИСТЕМНЫЕ Z - ПЕРЕМЕННЫЕ
Это соответствует раскручиванию стека выполнения до уровня на котором был установлен обработчик и переходу на обработчик по команде
goto.
Если значение $ztrap при присваивании содержит символ "*" перед
меткой, то при этом выполняется код эквивалентный коду:
set $etrap="g "_$e($ztrap,2,$l($ztrap))
Это соответствует переходу на обработчик ошибок на уровне стека,
на котором возникла ошибка.
Пример:
USER>s $zt="err^errhandler"
USER>w $et
g:’$es err^errhandler
USER>s $zt="*err^errhandler"
USER>w $et
g err^errhandler
В случае если системной переменной $ztrap присваивается значение
не соответствующее ни одной допустимой форме, то MiniM генерирует
ошибку <SYNTAX>.
8.14
$ZVERSION
Возвращает строку о версии MiniM.
Синтаксис
$ZV[ERSION]
Переменная $zversion возвращает строку информации о версии текущей инсталляции MiniM. Строка начинается со слова MiniM, после
которого через пробелы идёт информация о целевой операционной системе, номер версии и дата сборки.
Пример:
TEMP>w $zv
MiniM for Windows 32 bit ...
8.14. $ZVERSION
295
MiniMono difference
В MiniM Embedded Edition значение $zversion содержит строку MiniMono:
MiniMono for Windows ...
MiniM x64 difference
В версии MiniM x64 значение $zversion содержит указание на разрядность MiniM:
MiniM for Windows x64 ...
296
ГЛАВА 8. СИСТЕМНЫЕ Z - ПЕРЕМЕННЫЕ
Глава 9
Структурные системные
переменные
9.1
$DEVICE
Структурная системная переменная ˆ$DEVICE представляет информацию об открытых текущим процессом устройствах ввода-вывода.
Синтаксис
ˆ$D[EVICE](deviceid)
deviceid - строка идентификации устройства ввода-вывода. Строки идентификации соответствуют строкам, по которым устройствами ввода-вывода
оперирут команды open, use, close. Структурная переменная ˆ$DEVICE
поддерживает только один уровень индексов. Если процесс успешно открыл устройство ввода-вывода, то строка идентификации этого устройства присутствует в качестве значения индекса первого уровня переменной ˆ$DEVICE.
Возможно использование структурной переменной ˆ$DEVICE в качестве аргументов функций $data, $order и $query.
ˆ$DEVICE как аргумент функции $data
Применение функции $data к структурной переменной ˆ$DEVICE
позволяет определить, открыто ли заданное устройство текущим процессом или нет. Для открытых устройств функция $data возвращает
значение 1, иначе возвращает значение 0.
TEMP>w $d(^$D($io))
1
297
298
ГЛАВА 9. СТРУКТУРНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
TEMP>w $d(^$D("
0
TEMP>o "|NULL|"
"))
TEMP>w $d(^$D("|NULL|"))
1
ˆ$DEVICE как аргумент функции $order
Применение функции $order к структурной переменной ˆ$DEVICE
позволяет перечислить идентификаторы открытых процессом MiniM устройств.
Функции $order можно задавать направление перечисления как по возрастанию, так и по убыванию. Если следующего по порядку сортировки
имени устройства нет, то функция возвращает пустую строку.
TEMP>s dev="|NULL|" o dev
TEMP>s dev="" f
|CON|
|NULL|
s dev=$o(^$D(dev)) q:dev=""
w dev,!
ˆ$DEVICE как аргумент функции $query
Применение функции $query к структурной переменной ˆ$DEVICE
позволяет перечислить все имена узлов ˆ$DEVICE. Если следующего узла не найдено, то функция $query возвращает пустую строку. В функции
$query, применительно к имени переменной ˆ$DEVICE, можно использовать задание направления перечисления имён.
TEMP>s dev="|NULL|" o dev
TEMP>s n=$na(^$d("")) f
^$DEVICE("|CON|")
^$DEVICE("|NULL|")
s n=$q(@n) q:n=""
w n,!
Чтение из структурной системной переменной ˆ$DEVICE, присваивание значений или удаление командой kill не поддерживаются.
9.2 $GLOBAL
Структурная системная переменная ˆ$GLOBAL предоставляет информацию об имеющихся в базе данных глобалах, имеющих значения.
9.2. $GLOBAL
299
Синтаксис
ˆ$G[LOBAL](globalname)
globalname - имя глобала. Структурная переменная ˆ$GLOBAL поддерживает только один уровень индексов.
В качестве индекса должно быть указано имя глобала. Не допускается указывать индексы глобала, в этом случае MiniM генерирует ошибку
<SSVNSUBSCRIPT>. Имя глобала может быть указано как без базы
данных, так и с базой данных. Если имя указано без базы данных,
то производится обращение к именам глобалов в текущей базе. Если
имя указано с именем базы данных, то обращение производится к указанной базе. Если такой базы не существует, то генерируется ошибка
<NAMESPACE>.
Возможно использование структурной системной переменной ˆ$GLOBAL
в качестве аргумента функций $data, $order, $query и в качестве аргумента команды kill.
ˆ$GLOBAL как аргумент функции $data
Применение функции $data к структурной переменной ˆ$GLOBAL
позволяет определить, существует ли заданная глобаль или нет. Для
существующих глобалов функция $data возвращает значение 1, а для
несуществующих - 0. MiniM считает, что глобал существует, если в
нём есть хотя бы один узел, имеющий значение. Если нет ни одного, то
глобал не существует. Например:
TEMP>w $d(^$G("^a"))
0
TEMP>w $d(^$G("^|""aa""|a"))
<NAMESPACE>
TEMP>w $d(^$G("^a(123)"))
<SSVNSUBSCRIPT>
ˆ$GLOBAL как аргумент функций $order и $query
Применение функции $order к структурной переменной ˆ$GLOBAL
позволяет перечислить имена имеющихся в базе данных MiniM глобалов. Функции $order можно задавать направление перечисления как по
возрастанию, так и по убыванию. Если следующего глобала нет, то функция возвращает пустую строку. Чтобы получить соответственно первое
300
ГЛАВА 9. СТРУКТУРНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
и последнее имя глобала, нужно использовать для начального имени
пустую строку.
Функция $order возвращает имя глобала, функция $query возвращает имя переменной ˆ$GLOBAL с именем глобала в качестве первого
индекса.
Если функции $order указывать имя глобала с указанием базы, то
поиск следующего имени производится в указанной базе, если имя базы
не указано, то поиск производится в текущей базе.
MiniM поддерживает условное отображение глобалов на основе двух
правил:
1) Глобалы с именам, начинающимися на символ %, физически размещаются в области "%SYS" и видны всем процессам;
2) Глобалы с именами, начинающимися со строки mtemp, физически
размещаются в области "temp" и видны всем процессам.
При перечислении имён глобалов структурная системная переменная
ˆ$GLOBAL придерживается этого правила, поэтому её использование в
функции $order, а также в функции $query, приводит к перечислению не
только глобалов, которые физически размещены в текущей базе данных,
но и глобалов с именами, начинающимися с символа % и со строки
mtemp, в соответствии с правилами их сортировки.
Функция $order возвращает имена глобалов, в то время как функция
$query возвращает имена структурной переменной ˆ$GLOBAL с первым
индексом именем глобала.
Если функции $query передано имя структурной переменной ˆ$GLOBAL
с именем глобала с указанием области, то возвращаемое имя также содержит область, иначе возвращается имя с индексом с именем глобала
без области. Возвращаемая область приводится к верхнему регистру и
обрамляется стандартными символами ||.
В случае если функции $order и $query принимают в качестве индекса не пустую строку и строку, не являющуюся именем глобала без
индексов, то функции генерируют ошибку <SSVNSUBSCRIPT>.
ˆ$GLOBAL как аргумент команды kill
Структурную переменную ˆ$GLOBAL можно использовать как аргумент команды kill. В этом случае, команда удаляет глобальную переменную, имя которой указано в индексе переменной ˆ$GLOBAL. Например:
USER>w ^a
a
USER>k ^$G("^a")
9.3. $JOB
301
USER>w ^a
<UNDEFINED>
В этом примере действие команды kill полностью эквивалентно команде
kill ^a
9.3
$JOB
Структурная системная переменная ˆ$JOB предоставляет информацию
об имеющихся в системе MiniM процессах, а также позволяет удалить
указанный процесс.
Синтаксис
ˆ$J[OB](jobnumber)
jobnumber - номер процесса. Номера соответствуют значениям, возвращаемым системной переменной $JOB. Структурная переменная ˆ$JOB
поддерживает только один уровень индексов.
Возможно использование структурной системной переменной ˆ$JOB
в качестве аргумента функций $data, $order, $query и в качестве аргумента команды kill.
ˆ$JOB как аргумент функции $data
Применение функции $data к структурной переменной ˆ$JOB позволяет определить, существует ли заданный процесс в системе или нет.
Для существующих процессов функция $data возвращает значение 1, а
для несуществующих - 0.
TEMP>w $d(^$j($j))
1
TEMP>w $d(^$j("fdf"))
0
ˆ$JOB как аргумент функции $order
Применение функции $order к структурной переменной ˆ$JOB позволяет перечислить номера имеющихся в системе MiniM процессов. Функции $order можно задавать направление перечисления как по возрастанию, так и по убыванию. Если следующего номера процесса нет, то
функция возвращает пустую строку.
302
ГЛАВА 9. СТРУКТУРНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
TEMP>s j="" f
1660
1250
s j=$o(^$j(j)) q:j=""
w j,!
ˆ$JOB как аргумент функции $query
Применение функции $query к структурной переменной ˆ$JOB позволяет перечислить все имена узлов ˆ$JOB. Если следующего узла не найдено, то функция $query возвращает пустую строку. В функции $query
применительно к имени переменной ˆ$JOB можно использовать задание
направления перечисления имён.
TEMP>s n=$na(^$j("")) f
^$JOB("1608")
s n=$q(@n) q:n=""
w n,!
ˆ$JOB как аргумент команды kill
Система MiniM позволяет использовать имя структурной переменной
ˆ$JOB с индексом в качестве аргумента команды kill. В этом случае система уничтожает процесс, номер которого задан в индексе переменной
ˆ$JOB. Применять удаление собственного процесса не допускается. Удаляемый процесс переключается в выполнение команды halt и завершает
работу. В случае если удаление применяется к номеру собственного процесса или к несуществующему номеру процесса, команда kill генерирует
ошибку <JOB>.
Чтение из структурной переменной ˆ$JOB
При чтении из структурной переменной ˆ$JOB(pid) возвращается 4
индикатора состояния процесса pid в формате функции $listbuild(). Порядок значений:
1
2
3
4
Текущая база данных процесса. ($znspace)
Текущая рутина процесса. ($zname)
Устройство процесса по умолчанию. ($principal)
Последняя глобальная ссылка. ($zreference)
Часть этих полей с конца списка может отсутствовать, поэтому получив список значений характеристик процесса каждую из характеристик
нужно получать из списка через функцию $listget().
При чтении характеристик несуществующего процесса генерируется
ошибка <SSVN VALUE>.
9.4. $LOCK
303
При чтении значения ˆ$JOB(pid) через функцию $get() при обращении к несуществующему номеру процесса возвращается значение указанное как значение по умолчанию или если оно не указано то возвращается пустая строка.
9.4
$LOCK
Структурная системная переменная ˆ$LOCK предоставляет информацию
об имеющихся в системе блокировках, установленных командой lock.
Позволяет получить информацию о блокировании локального или глобального имени, перечислить имеющиеся блокированные имена, определить, какой процесс заблокировал имя и какой счётчик блокировок у
данной блокировки, а также удалить заданную блокировку.
Синтаксис
ˆ$L[OCK](lockname)
lockname - вычисляемое выражение, вычисляется как строка, содержащая имя глобальной или локальной переменной. Может содержать индексы, для имени глобальной переменной может указываться область.
При использовании глобальных переменных действует правило, что
неуказывание области или использование в качестве имени области пустой строки эквивалентно использованию текущей области, имена областей нечувствительны к регистру. Функции, перечисляющие блокированные имена, приводят имя области к нормализованному виду - указывают полностью в верхнем регистре.
Возможно использование структурной системной переменной ˆ$LOCK
в качестве выражения аргумента функций $get, $data, $order, $query и
в качестве аргумента команды kill.
ˆ$L[OCK] как аргумент функции $data
При использовании функции $data с переменной ˆ$LOCK функция
возвращает полный индикатор существования - было ли блокировано
указанное имя и были ли блокированы одно или более имен с дополнительными индексами.
TEMP>l
TEMP>w $d(^$l("^a"))
0
TEMP>l +^a
304
ГЛАВА 9. СТРУКТУРНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
TEMP>w $d(^$l("^a"))
1
TEMP>l +^a(1)
TEMP>w $d(^$l("^a"))
11
TEMP>l -^a
TEMP>w $d(^$l("^a"))
10
ˆ$L[OCK] как аргумент функции $order
Применение функции $order к переменной ˆ$LOCK позволяет перечислить имеющиеся имена переменных, блокированных каким-либо
процессом MiniM. Имена блокированных локальных переменных возвращаются как есть, а имена блокированных глобальных переменных
возвращаются с указанием полного имени, включая имя базы данных.
Имена локальных переменных считаются младше имён глобальных.
TEMP>l +a,+^a,+b,+^b
TEMP>s n="" f
a
b
^|"TEMP"|a
^|"TEMP"|b
s n=$o(^$l(n)) q:n=""
w n,!
Также как при использовании локальных или глобальных имён функция $query использует направление перечисления и при отсутствии следующего узла возвращает пустую строку.
TEMP>s n="" f
^|"TEMP"|b
^|"TEMP"|a
b
a
s n=$o(^$l(n),-1) q:n=""
w n,!
ˆ$L[OCK] как аргумент функции $query
Применение функции $query позволяет перечислить полные имена
узлов структурной переменной ˆ$LOCK. Также как при использовании
9.4. $LOCK
305
имён локальных или глобальных переменных, при отсутствии следующего узла функция возвращает пустую строку и использует задание
направления перечисления имён.
TEMP>s n=$na(^$l("")) f
^$LOCK("a")
^$LOCK("b")
^$LOCK("^|""TEMP""|a")
^$LOCK("^|""TEMP""|b")
s n=$q(@n) q:n=""
w n,!
TEMP>s n=$na(^$l("")) f
^$LOCK("^|""TEMP""|b")
^$LOCK("^|""TEMP""|a")
^$LOCK("b")
^$LOCK("a")
s n=$q(@n,-1) q:n=""
w n,!
ˆ$L[OCK] как аргумент функции $get и чтение значения
Чтение структурной перемнной ˆ$LOCK в MiniM допускается, и при
чтении возвращается значение в формате <номер процесса> и <количество блокировок>, разделённые двоеточием.
TEMP>l +a w ^$LOCK("a")
1660:1
TEMP>l +a,+a
TEMP>w ^$LOCK("a")
1660:3
Если в аргумент функции $get передано имя из переменной ˆ$LOCK
с несуществующим узлом, то функция возвращает либо свой второй
аргумент, либо, если он не указан, пустую строку.
TEMP>l
TEMP>w ^$LOCK("abcd")
<UNDEFINED>
TEMP>w $g(^$LOCK("abcd"),"undef")
undef
306
ГЛАВА 9. СТРУКТУРНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
ˆ$L[OCK] как аргумент команды kill
В системе MiniM допускается использовать структурную переменную ˆ$LOCK в качестве аргумента команды kill. При выполнении команда удаляет указанную блокировку, если она существовала, независимо
от того, какой процесс её поставил и независимо от счётчика блокировок. Например:
k ^$LOCK("a")
9.5
$ROUTINE
Структурная системная переменная ˆ$ROUTINE предоставляет информацию об имеющихся в базе данных программах.
Синтаксис
ˆ$R[OUTINE](routinename)
routinename - имя рутины без циркумфлекса. Структурная переменная
ˆ$ROUTINE поддерживает только один уровень индексов.
При не указании хотя бы одного индекса генерируется ошибка <SSVNSUBSCRIPT>,
при любых обращениях к этой переменной. Имя рутины указывается без
циркумфлекса и области.
ˆ$ROUTINE как аргумент функции $data
Применение функции $data к структурной переменной ˆ$ROUTINE
позволяет определить, существует ли в базе исходный код заданной рутины. Для существующих рутин функция возвращает 1, иначе 0. Например:
$d(^$r("alpha"))
проверяет, существует ли в базе рутина alpha.
ˆ$ROUTINE как аргумент функций $order и $query
Применение функций $order и $query позволяет перечислить имена
имеющихся в базе данных MiniM рутин. Функциям $order и $query
можно задавать направление перечисления как по возрастанию, так и
по убыванию. Если следующей рутины в порядке сортировки нет, то
возвращается пустая строка. Чтобы получить первое имя в порядке перечисления, нужно указать пустую строку. Имя рутины передаётся как
первый индекс переменной ˆ$ROUTINE.
9.5. $ROUTINE
307
При перечислении имён рутин переменная ˆ$ROUTINE перечисляет
только рутины в текущей области, не используя имена системной области "%sys", хотя при работе процессов все рутины, начинающиеся с
символа %, загружаются и используются как рутины в текущей области.
Для перечисления имён рутин системной области, и начинающиеся
с символа %, нужно переключить процесс в область "%sys".
ˆ$ROUTINE как аргумент команды kill
Передача команде kill структурной переменной ˆ$ROUTINE с индексом именем рутины приводит к удалению исходного кода рутины. Объектный код рутины, если он есть, остаётся и может быть использован
процессами для выполнения. Например:
kill ^$r("alpha")
приводит к удалению исходного кода рутины alpha.
308
ГЛАВА 9. СТРУКТУРНЫЕ СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
Глава 10
Параметры устройств
10.1
COM
Устройства типа |COM| поддерживаются только в Windows - версиях
MiniM Database Server и MiniMono.
Устройство типа |COM| предназначено для взаимодействия с COM
портами компьютера, управления их параметрами и для передачи данных. Запись и чтение данных порта производится с помощью команд
read и write, управление состоянием с помошью команды use и отдельные специальные случаи управления выполнены с помошью функции
$view("dev").
Строка идентификации устройства формируется как "|COM|N" где N
номер COM порта. Например, для операций с портом 2 нужно использовать имя устройства
"|COM|2"
Номер порта должен быть указан без лидирующих нулей.
Операционная система Windows позволяет нескольким программам
одновременно оперировать одним и тем же устройством за немногими
исключениями, например модема, подключенного и работающего как
провайдер Internet, или используемой мыши.
При открытии командой open и при использовании устройства текущим командой use можно использовать параметры, перечисленные ниже.
При закрытии устройства командой close параметры игнорируются.
Параметры устройства |COM|
Параметр /MODE=expr
309
310
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Параметр /MODE задаёт режим открытия устройства. Выражение
expr вычисляется как строка и рассматривается как набор символьных
флагов. В строке рассматриваются символьные флаги:
r или R
w или W
t или T
b или B
иное
Задаёт разрешение на чтение из устройства.
Задаёт разрешение на запись в устройство.
Включает текстовый режим чтения - записи.
Включает бинарный режим чтения - записи.
Игнорируется
Если параметр не указан, то считается режим по умолчанию rt, разрешение на чтение, запрет на запись и текстовый режим чтения.
Если в строке не указан режим текстовый или бинарный, то по
умолчанию устанавливается текстовый. Если не указано разрешение ни
на чтение, ни на запись, то обе команды будут генерировать ошибки
<READ> или <WRITE> соответственно.
При влючении текстового режима вывод перевода строки
write !
выводит в устройство символы $c(13,10), а при включении бинарного
режима только $c(10).
Параметр /MODE может задаваться позиционно в первой позиции
или именованно в любой позиции.
Параметр /TERM=expr
Параметр /TERM задаёт терминатор чтения строки для бинарного
режима. Выражение expr вычисляется как строка и используется как
терминатор. При чтении строки терминатор не входит в прочитанное
значение.
Для текстового режима задание терминатора игнорируется. Терминатором текстового режима служит символ $c(10). Если перед ним прочитан символ $c(13), то он также изымается из прочитанной строки.
Значение терминатора по умолчанию - пустая строка.
Параметр /TERM может задаваться как позиционный во второй позиции, как и именованный в любой позиции.
Остальные нижеперечисляемые параметры все могут задаваться только в именованной форме.
Параметр /BAUD=expr
Значение expr вычисляется как целое число, задает скорость обмена
данными с портом, единица измерения бит в секунду. Значения меньше
10.1. COM
311
110 и больше 256000 приводит к генерации ошибки <DEVPARAM>. Допускается использовать любое число в этом пределе. Можно учитывать,
что рекомендуемыми стандартными скоростями являются 110, 300, 600,
1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200,
128000, 256000.
Параметр /PARITYCHECK=expr
Включает режим контроля четности. Значение expr вычисляется как
число и сравнивается с нулем. Если не равно нулю, то выполняется
проверка четности, при ошибке, в вызывающую программу выдается соответствующий код завершения. Если равно нулю, то проверка четности
не выполняется.
Параметр /CTS=expr
Включает режим слежения за сигналом CTS. Если значение expr вычисляется как не ноль, и сигнал CTS сброшен, передача данных приостанавливается до установки сигнала CTS. Это позволяет подключеному к
компьютеру прибору приостановить поток передаваемой в него информации, если он не успевает ее обрабатывать.
Параметр /DSR=expr
Включает режим слежения за сигналом DSR. Если значение expr
вычисляется как не ноль и сигнал DSR сброшен, передача данных прекращается до установки сигнала DSR.
Параметр /DSRS=expr
Задает чувствительсть коммуникационного драйвера к состоянию линии DSR. Если значение expr вычисляется как не ноль, то все принимаемые данные игнорируются драйвером (коммуникационный драйвер
расположен в операционной системе), за исключением тех, которые принимаются при установленом сигнале DSR.
Параметр /TXC=expr
Задает, прекращается ли передача при переполнении приемного буфера и передаче драйвером символа XOFFCHAR.
Если значение expr вычисляется как не ноль, то передача продолжается, несмотря на то, что приемный буфер содержит более XOFFLIM
символов и близок к переполнению, а драйвер передал символ XOFFCHAR
для приостановления потрока принимаемых данных.
Если значение expr вычисляется как ноль, то передача не будет продолжена до тех пор, пока в приемном буфере не останется меньше
312
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
XONLIM символов и драйвер не передаст символ XONCHAR для возобновления потока принимаемых данных. Таким образом это поле вводит
некую зависимость между управлением входным и выходным потоками
информации.
Параметр /ABORTONERROR=expr
Задает игнорирование всех операций чтения/записи при возникновении ошибки. Если значение expr вычисляется как не ноль, драйвер
прекращает все операции чтения / записи для порта при возникновении ошибки. Продолжать работать с портом можно будет только после
устранения причины ошибки и вызова системной переменной $zb.
Параметр /OUTX=expr
Задает использование XON / XOFF управления потоком при передаче. Если значение expr вычисляется как не ноль, то передача останавливается при приеме символа XOFFCHAR, и возобновляется при приеме
символа XONCHAR.
Параметр /INX=expr
Задает использование XON / XOFF управления потоком при приеме.
Если значение expr вычисляется как не ноль, то драйвер передает символ XOFFCHAR, когда в приемном буфере находится более XOFFLIM,
и XONCHAR, когда в приемном буфере остается менее XONLIM символов.
Параметр /NULL=expr
Определяет действие выполняемое при приеме нулевого байта. Если
значение expr вычисляется как не ноль, то нулевые байты отбрасываются
при передаче.
Параметр /DTR=expr
Задает режим управления обменом для сигнала DTR. Значение expr
вычисляется как целое число и может принимать следующие значения:
0
1
2
Запрещает использование линии DTR
Разрешает использование линии DTR
Разрешает использование рукопожатия для выхода из ошибочных ситуаций. Этот режим используется, в частности, модемами при восстановленни в ситуации потери связи.
При иных значениях генерируется ошибка <DEVPARAM>.
10.1. COM
313
Параметр /RTS=expr
Задает режим управления потоком для сигнала RTS. Значение expr
вычисляется как целое число и может принимать следующие значения:
0
1
2
3
Запрещает использование линии RTS
Разрешает использование линии RTS
Разрешает использование RTS рукопожатия.
Драйвер устанавливает сигнал RTS когда приемный буфер заполнен менее, чем на половину,
и сбрасывает, когда буфер заполняется более
чем на три четверти.
Задает, что сигнал RTS установлен, когда есть
данные для передачи. Когда все символы из передающего буфера переданы, сигнал сбрасывается.
По умолчанию используется режим 2. При иных значениях генерируется ошибка <DEVPARAM>.
Параметр /BYTESIZE=expr
Определяет число информационных бит в передаваемых и принимаемых байтах. Допустимые значения 5, 6, 7, 8. При иных значениях генерируется ошибка <DEVPARAM>.
Параметр /PARITY=expr
Определяет выбор схемы контроля четности. Значение expr вычисляется как целое число и может принимать следующие значения:
0
1
2
3
4
Бит четности отсутствует
Дополнение до нечетности
Дополнение до четности
Бит четности всегда 1
Бит четности всегда 0
При иных значениях генерируется ошибка <DEVPARAM>.
Параметр /STOPBITS=expr
Задает количество стоповых бит. Значение expr вычисляется как число с плавающей точкой и может принимать следующие значения:
1.0
1.5
Один стоповый бит
Полтора стоповых бита
314
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
2.0
Два стоповых бита
При иных значениях генерируется ошибка <DEVPARAM>.
Комбинация из пяти битного байта и двух стоповых бит является
недопустимой. Так же как и комбинация из шести, семи или восьми
битного байта и полутора стоповых бит.
Параметр /XONLIM=expr
Задает минимальное число символов в приемном буфере перед посылкой символа XON. Максимальное число expr - 64К.
Параметр /XOFFLIM=expr
Определяет максимальное количество байт в приемном буфере перед
посылкой символа XOFF. Максимально допустимое количество байт в
буфере вычисляется вычитанием данного значения из размера применого
буфера в байтах. Максимальное число expr - 64К.
Параметр /XONCHAR=expr
Задает символ XON используемый как для примема, так и для передачи. Значение expr вычисляется как строка и используется ее первый
символ. Если строка пустая, то генерируется ошибка <DEVPARAM>.
Параметр /XOFFCHAR=expr
Задает символ XOFF используемый как для примема, так и для передачи. Значение expr вычисляется как строка и используется ее первый
символ. Если строка пустая, то генерируется ошибка <DEVPARAM>.
Параметр /ERRORCHAR=expr
Задает символ, использующийся для замены символов с ошибочной
четностью. Значение expr вычисляется как строка и используется ее
первый символ. Если строка пустая, то замены не производится.
Параметр /EOFCHAR=expr
Задает символ, использующийся для сигнализации о конце данных.
Значение expr вычисляется как строка и используется ее первый символ.
Если строка пустая, то используется символ $c(0).
Параметр /EVTCHAR=expr
Задает символ, использующийся для сигнализации о событии. Значение expr вычисляется как строка и используется ее первый символ.
Если строка пустая, то генерируется ошибка <DEVPARAM>.
Значение системной переменной $za
10.1. COM
315
При чтении системной переменной $za если текущим устройством
является устройство типа |COM| выполняется чтение набора масок событий порта. Маски являются единичными битами в различных позициях
возвращаемого числа. Поэтому по правилам арифметики возвращаемое
число есть сумма отдельных чисел. Выяснить вхождение бита в возвращаемое значение можно с помощью операций \ и #. Например, пусть
возвращаемое число образовано суммой двух - #10+#20 (16+32), тогда
выяснить вхождение маски можно так (для наглядности используются
шестнадцатеричные числа):
USER>w (#10+#20\#10#2)
1
USER>w (#10+#20\#20#2)
1
USER>w (#10+#20\#40#2)
0
USER>w (#10+#20\#8#2)
0
Значит что в число 48 маски #10 и #20 входят, а #40 и #8 не
входят. Поскольку символ # для команды write является управляющим,
выражение взято в круглые скобки.
Маски произошедших событий:
#0040
#0008
#0010
#0080
#0100
#0020
#0001
#0002
#0004
#0800
#1000
#0200
#0400
Состояние разрыва приемной линии
Изменение состояния линии CTS
Изменение состояния линии DSR
Ошибка обрамления, перебега или четности
Входящий звонок на модем (сигнал на линии RI
порта)
Изменение состояния линии RLSD (DCD)
Символ принят и помещен в приемный буфер
Принят символ заданый значением EVTCHAR
Из буфера передачи передан последний символ
Устройство-зависимое событие 1
Устройство-зависимое событие 2
Ошибка принтера
Приемный буфер заполнен на 80 процентов
Значение системной переменной $zb
316
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
При чтении системной переменной $zb если текущим устройством
является устройство типа |COM| выполняется чтение набора масок ошибок порта. Маски ошибок:
#0010
#0008
#8000
Обнаружено состояние разрыва связи
Ошибка обрамления.
Запрошеный режим не поддерживается. Если
данный бит установлен, то значение остальных
бит не имеет значение.
Ошибка перебега (переполнение аппаратного
буфера), следующий символ потерян.
Переполнение приемного буфера или принят
символ после символа конца файла (EOF)
Ошибка четности
Переполнение буфера передачи
#0002
#0001
#0004
#0100
Чтобы выяснить вхождение маски ошибки в возвращаемое значение
нудно применить ту же алгоритмику, что описана по системной переменной $za. При обращении к системной переменной $zb для устройства |COM| состояние ошибки порта сбрасывается и следующее чтение
может вернуть иное значение.
Дополнительное управление портом
Кроме использования параметров устройства предоставляются средства в виде расширенных функций $v("dev",5), $v("dev",6) и $v("dev",7).
См. их описание в разделе функций $v("dev").
Команда write #
Команда сбрасывает входной и выходной буфер порта.
Команда write ?N
Команда приводит к записи в порт N пробелов. Количества меньше 1
и больше 32К игнорируются и действие не выполняется.
Пример чтения строки идентификации модема, подключенного к порту 2:
USER>k
s dev="|COM|2" o dev
USER>u dev:(/BYTESIZE=8:/BAUD=115200:/MODE="rwt") >>
>> w "ATI3",$c(13,10),# r ans,ans,#
USER>c dev
10.2. CON
317
USER>w
ans="U.S. Robotics 56K FAX EXT Rev. 11.15.19"
dev="|COM|2"
Здесь операции чтения и записи завершаются сбросом буфера. Устанавливается одна из стандартных скоростей обмена, размер байта 8 бит и
текстовый режим чтения-записи. Чтение сначала вычитывает эхо, затем
строку идентификации.
10.2
CON
Устройство CON создаётся автоматически при запуске процесса, если не
было указано запускать процесс, как телнет-процесс, не через команду
job, не было перенаправления ввода через <, и не было в параметрах командной строки явного указания использовать стандартный ввод-вывод.
Например, запуск процесса как
minim.exe
приводит к автоматическому созданию устройства ввода-вывода по умолчанию CON:
W:\MiniM\bin>minim.exe
TEMP>w $p
|CON|
TEMP>w $io
|CON|
TEMP>
Это устройство не может быть открыто явно или закрыто, и устройство ввода-вывода по умолчанию не может быть заменено на другое.
В работе процесс MiniM использует для ввода-вывода консольное окно
Windows.
У устройства CON нет параметров закрытия (закрытие устройства по
умолчанию всегда игнорируется) и параметров открытия (CON не может
быть открыт явно).
Параметры команды use
В команде use применительно к устройству CON поддерживаются
параметры:
318
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
/COLUMNS = expr
/LINES = expr
/ECHO = expr
/TERM = expr
/OEM = expr
/CTRLC = expr
иное
Использовать указанное количество колонок.
Использовать
указанное
количество
строк.
Использовать или не использовать режим
эха.
Терминатор чтения строки
Переключение перекодирования Oem Ansi
Генерировать ли прерывание при нажатии
Ctrl+C
Игнорируется.
Параметр /COLUMNS = expr
Параметр /COLUMNS = expr задаёт, сколько колонок использовать
при вводе-выводе. Если параметр не указан, то используется текущее
значение. При создании устройства значение по умолчанию 80.
Параметр /COLUMNS = expr может задаваться как позиционно в
первой позиции, так и именованно в любой позиции.
Значение expr вычисляется как целое число. Если число получается
меньше или равно 0, то генерируется ошибка <DEVPARAM>.
Параметр /LINES = expr
Параметр /LINES = expr задаёт, сколько строк использовать при
вводе-выводе. Если параметр не указан, то используется текущее значение. При создании устройства значение по умолчанию 25.
Параметр /LINES = expr может задаваться как позиционно во второй
позиции, так и именованно в любой позиции.
Значение expr вычисляется как целое число. Если число получается
меньше или равно 0, то генерируется ошибка <DEVPARAM>.
Параметр /ECHO = expr
Параметр /ECHO = expr задаёт режим повтора ввода на экране. Если параметр не указан, то используется текущий режим. При создании
устройства режим эха включён.
Значение expr вычисляется как целое число. Если результат равен
нулю, то режим эха отключается, иначе - включается. При подавлении
эха ввод пользователя не приводит к выводу символов на экран.
Параметр /ECHO может задаваться как позиционно в третьей позиции, так и именованно в любой позиции.
10.2. CON
319
Параметр /OEM = expr
Параметр /OEM = expr включает или отключает перекодирование
символов OEM - ANSI. По умолчанию перекодирование включено и
устройство поддерживает на стороне консоли кодировку OEM и на стороне данных кодировку ANSI. Значение выражения expr вычисляется
как целое число и сравнивается с нулем. Если получилось число 0, то
перекодирование отключается. Если не ноль, то включается. Параметр
/OEM поддерживается только именованно.
Примеры
use $p:/OEM=0
use $p:/OEM=1
; отключить
; включить
Параметр /CTRLC = expr
Параметр /CTRLC = expr включает или отключает генерацию ошибки
прерывания <INTERRUPT> при вводе клавишной комбинации Ctrl+C.
Если значение expr вычисляется как ноль, то генерация прерывания выключается и нажатие Ctrl+C может быть считано командой чтения. Если
не ноль, то включается генерация прерывания <INTERRUPT> при нажатии Ctrl+C. По умолчанию генерация прерывания включена. Параметр
/CTRLC должен иметь значение expr. Применение параметра /CTRLC
возможно только именованно, позиционная форма не поддерживается.
Параметр /TERM = expr
Параметр /TERM = expr задает терминатор чтения строки. Чтение
строки заканчивается, если строка при ее вводе завершается указанной
в параметре строкой. Параметр /TERM для устройства консоли задается
только именованно, и не имеет позиционного представления. В случае,
если задается значение параметра равное пустой строке, то терминатор
удаляется и не используется. При вводе командной строки в командном
режиме заданный командой use терминатор чтения не используется и
при возврате в строку ввода команды терминатор не забывается и продолжает применяться при выполнении команд.
Терминаторы чтения
Терминаторами чтения в консоли при вводе командной строки являются символ ввода (ENTER) и символ отмены ввода (ESC). Они же являются терминаторами если установлен терминатор чтения пустая строка. На ненулевом уровне стека, если установлен терминатор чтения, то
используется он.
320
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
При работе в режиме ввода строки работает внутренний редактор
строки, формирующий ANSI последовательности для вывода символов
на консоль. При чтении символов производится прямое чтение буфера
ввода процесса.
Дополнения к значению $KEY
При вводе символов с консоли в системную переменную $key дописываются символы "a", "c", "s" в случае если при нажатии функциональной клавиши были нажаты служебные клавиши Alt, Ctrl и Shift
соответственно. Если было нажато две альтернирующие клавиши, то
дописывается два символа, если все три - то три. Нажатие левого и правого Alt и левого и правого Ctrl не различается. Например, при вводе
Ctrl+F1 получим:
USER>r *x s k=$k zzdump x,k
0000: 32 37
0000: 1B 4F 50 63
27
.OPc
а при вводе Ctrl+Shift+F1 получим:
USER>r *x s k=$k zzdump x,k
0000: 32 37
0000: 1B 4F 50 63 73
27
.OPcs
К функциональным клавишам в данном случае относятся также клавиши Insert, Delete, Home, End, Page Up, Page Down и клавиши стрелок.
Поскольку в основные эскейп-последовательности функциональных
клавиш маленькие латинские буквы не входят, можно получить код самой клавиши независимо от нажатия альтернирующих так:
$tr($key,"acs")
что приведет к отбрасыванию дополнительных символов-индикаторов,
если они есть.
MiniMono difference
В MiniM Embedded Edition устройство |CON| не поддерживается.
10.4. FILE
10.3
321
DLL
Устройство типа |DLL| создается автоматически как устройство вводавывода по умолчанию для MiniM Embedded Edition.
Хост-процесс при инициализации библиотеки MiniMono объявляет
какие обработчики событий устройства |DLL| он поддерживает. В случае если они есть, при выполнении программы на MUMPS эти обработчики вызываются. Если какой-либо обработчик для устройства |DLL|
не указан, то MiniMono для этого события с устройством использует
поведение по умолчанию.
Поддерживаемые опции и поведение устройства полностью определяются внешней хост-программой.
10.4
FILE
Устройства типа FILE оперируют файлами операционной системы. Используются последовательные операции - открытие, позиционирование,
чтение, запись, закрытие.
Устройства типа FILE идентифицируются строками, начинающимися
на "|FILE|", после которых следует имя файла. Имена устройств различаются по регистру. Поэтому можно открыть один и тот же файл дважды,
используя разные устройства. Например:
|FILE|c:/temp/dat.txt
|FILE|\\srv/temp/dat.txt
Файл c:/temp/dat.txt
Файл temp/dat.txt на компьютере srv
Устройства типа FILE игнорируют параметр тайм-аута открытия, поскольку технически не могут прервать открытие файла ранее, чем истечёт заданный тайм-аут. Но если тайм-аут указан, то при неуспехе открытия файла переменная $test принимает значение 0, иначе - значение
1.
MiniM поддерживает задание как позиционных, так и именованных
параметров. Если значение параметра указано без имени, то используется по позиции, иначе параметр может быть указан с именем и в
произвольной позиции.
Параметры команды open
/MODE
/SHARE
Режим открытия файла.
Режим разделения файла с другими процессами.
322
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
/TERM
/TRUNCATE
Строка - терминатор чтения.
Индикатор, производить ли усечение файла при открытии.
Параметр /MODE
Параметр задаётся строкой, в которой символы означают режим открытия. Символы (флаги открытия) могут быть указаны в произвольном
порядке и используются нечувствительно к регистру. Параметр является
позиционно первым, если используется без имени.
r
w
a
t
b
n
e
Открыть файл на чтение. Флаг может комбинироваться с флагом w.
Открыть файл на запись. Флаг может комбинироваться с флагом r.
Открыть файл на дозапись. При открытии позиция
файла автоматически устанавливается в конец файла.
Открыть в текстовом режиме. Нельзя комбинировать
с флагом b.
Открыть в бинарном режиме. Нельзя комбинировать
с флагом t.
Создать новый файл с заданным именем.
Использовать имеющийся файл.
При открытии файла в бинарном режиме терминатором чтения по
умолчанию является пустая строка. Если задан терминатор чтения, то
он используется. Если файл открыт в текстовом режиме, то терминатором чтения является символ $c(10). Если при прочтении строки до
этого символа её последним символом оказался $c(13), то он изымается
из прочитанной строки, и строка возвращается командой чтения. Символ
$c(13) в других позициях не удаляется. Строка возвращается без терминаторов. Если файл открыт в текстовом режиме, то параметр /TERM
игнорируется, даже если он указан.
Если не указаны оба флага n и e, и опции w или a не были указаны, то считается, что нужно открыть существующий файл, не создавая
нового (как если бы был указан флаг e). Если не были указаны оба
флага n и e, и была указана опция w или a, то если файл существует,
то открывается имеющийся, а если не существует, то создается новый.
Примеры:
Открыть файл на запись в режиме дозаписи:
10.4. FILE
323
open "|FILE|c:\temp\text":("wa")
open "|FILE|c:\temp\text":(/MODE="wa")
Открыть имеющийся файл на чтение:
open "|FILE|c:\temp\text":("re")
open "|FILE|c:\temp\text":(/MODE="re")
Если параметр /MODE не указан, по умолчанию считается заданным
режим rte.
Если файл открыт в текстовом режиме, то запись перевода строки
write !
приводит к записи в файл двух символов c(13, 10)., c(10).
Параметр /SHARE
Параметр задаёт режим разделения доступа к файлу. Параметр либо
позиционный второй, либо именованный. Значение параметра задаётся
последовательностью символьных флагов нечувствительно к регистру.
r
w
e
Разрешить другим процессам открывать файл на чтение.
Разрешить другим процессам открывать файл на запись.
Не разрешать другим процессам никакой доступ к файлу.
Если параметр не задан, по умолчанию считается режим r.
Примеры:
Открыть файл на чтение, разрешая другим процессам читать:
open "|FILE|c:\temp\dat":(:"r")
open "|FILE|c:\temp\dat":(/SHARE="r")
Для команды open параметр /SHARE может задаваться позиционно
во второй позиции.
Параметр /TERM=expr
Параметр задаёт терминатор чтения при открытии файла в бинарном
режиме. Если параметр не задан, то считается пустая строка, и чтение
выполняется либо на заданную длину, либо на максимально допустимый
размер локальной переменной (32K).
Параметр терминатор /TERM=expr задаётся либо именованным (в
любой позиции), либо для команды open в третьей позиции, либо для
команды use во второй позиции.
324
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
При открытии файла в текстовом режиме терминатор чтения игнорируется.
Параметр /TRUNCATE
Параметр /TRUNCATE задаёт опцию усечения файла до нулевого
размера при его открытии. Параметр непозиционный, без значения. Если
параметр присутствует среди параметров открытия, то файл при открытии усекается до нулевого размера. Пример:
open "|FILE|c:\temp\report23":("w":"e":/TRUNCATE)
Здесь файл c:\temp\report23 открывается на запись с усечением до
нулевого размера.
Для выполнения операции /TRUNCATE в командах use и close требуется, чтобы файл был открыт с разрешением записи.
Параметры команды use
/LOCK = expr
/POS = expr
/SIZE = expr
/OFFSET = expr
/TRUNCATE
/TRUNCATE = expr
/TERM = expr
Указывает, выполнить блокировку файла. Комбинируется с параметром /SIZE
и необязательным указанием параметра
/POS.
Указывает, выполнить блокирование файла с указанной позиции. Необязательный
параметр.
Указывает, выполнить блокирование файла на указанный размер
Указывает направление блокирования.
Установить конец файла по текущей позиции файла.
Установить конец файла по заданной позиции файла.
Использовать указанный терминатор чтения.
Параметр /LOCK = expr
Параметр /LOCK указывает, что нужно выполнить файловую блокировку файла, используемого этим устройством. Значение expr вычисляется как строка, и она должна содержать первым символом символьный
флаг рода блокировки:
10.4. FILE
325
s или S
e или E
u или U
иное
Установить разделяемую блокировку.
Установить исключительную блокировку.
Снять блокировку.
Генерируется ошибка <DEVPARAM>.
Разделяемая блокировка может быть установлена на фрагмент файла
одновременно несколькими процессами так, что на этот участок другому процессу нельзя установить ни одну исключительную блокировку.
Исключительная блокировка устанавливается так, что на этот участок
другому процессу нельзя установить ни разделяемую, ни исключительную блокировку.
При снятии блокировки файла следует гарантировать, что начало и
размер блокируемого участка точно соответствуют установленной ранее
блокировке.
Один процесс может установить одновременно несколько блокировок на различные участки файла, в том числе разного рода, если это
не запрещено используемой дисциплиной блокирования. В случае если
процесс не может получить блокирование участка файла, он переходит
в режим ожидания, когда блокировка выполнится.
Параметр /LOCK не имеет позиционной формы, а только именованную.
Параметр /POS = expr
Параметр /POS = expr используется в сочетании с параметром /LOCK
для задания начала блокирования. Используется в сочетании с параметром /OFFSET, указывающим направление смещения от текущей позиции. Если параметр /POS не указан, то блокирование выполняется от
текущей позиции в файле.
Параметр /POS не имеет позиционной формы, только именованную.
Параметр /SIZE = expr
Параметр /SIZE = expr используется для задания размера блокируемого участка в сочетании с параметром /LOCK.
Параметр /SIZE не имеет позиционной формы, только именованную.
Параметр /OFFSET = expr
Параметр /OFFSET = expr используется для задания направления
смещения, указанного в параметре /POS. Значение expr вычисляется
как число. Допустимые значения:
0
Позиция отсчитывается от начала файла.
326
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
1
2
Позиция отсчитывается от текущего положения указателя в файле.
Позиция отсчитывается от конца файла.
Иное значение параметра приводит к генерации ошибки <DEVPARAM>.
Параметр /OFFSET не имеет позиционной формы, только именованную.
Двойное применение параметров /POS и /OFFSET
Если указан параметр /LOCK то параметры /POS, /OFFSET и /SIZE
применяются к блокировке файла. Если параметр /LOCK не указан, то
параметры /POS и /OFFSET изменяют текущую позицию в файле и
параметр /SIZE игнорируется.
Параметр /TRUNCATE
Параметр /TRUNCATE без значения в команде use указывает, что
нужно установить конец файла по текущей позиции, которая используется этим устройством. Параметр не имеет позиционной формы, только
именованную.
Параметр /TRUNCATE = expr
Параметр /TRUNCATE со значением указывает, что следует установить конец файла по указанной в выражении expr позиции. Значение
expr вычисляется как целое число. Параметр не имеет позиционной формы, только именованную.
Параметр /TERM = expr
Параметр /TERM указывает, что теперь следует использовать терминатор чтения, заданный выражением expr. Параметр применяется, только
если файл имеет бинарный режим доступа. Если режим доступа текстовый, то этот параметр игнорируется. В команде use параметр /TERM не
имеет позиционной формы, только именованную.
Параметры команды close
/TRUNCATE
/TRUNCATE = expr
/DELETE
/RENAME = expr
Установить конец файла по текущей позиции файла.
Установить конец файла по заданной позиции файла.
Удалить файл при закрытии.
Переименовать файл при закрытии.
10.4. FILE
327
Параметр /TRUNCATE
Параметр /TRUNCATE без значения в команде close указывает, что
при закрытии устройства, установить конец файла по текущей позиции,
которая используется этим устройством. Параметр не имеет позиционной
формы, только именованную.
Параметр /TRUNCATE = expr
Параметр /TRUNCATE со значением указывает, что при закрытии
устройства следует установить конец файла по указанной в выражении
expr позиции. Значение expr вычисляется как целое число. Параметр не
имеет позиционной формы, только именованную.
Примеры:
s dev="|FILE|c:\temp\log"
...
close dev:(/TRUNCATE)
Параметр /DELETE
Параметр /DELETE указывает, что при закрытии устройства следует удалить его файл. Параметр не имеет позиционной формы, только
именованную. Параметр не имеет значения.
Параметр /RENAME = expr
Параметр /RENAME = expr указывает, что при закрытии устройства
следует переименовать файл устройства в указанное имя. Выражение
expr вычисляется как строка и используется как новое имя файла. Параметр не имеет позиционной формы, только именованную со значением.
Например:
s dev="|FILE|c:\temp\log"
...
close dev:(/RENAME="c:\temp\log"_$h)
Начиная с версии 1.28 MiniM поддерживает рассчет системных переменных $X и $Y для устройств типа FILE в текстовом режиме (значение
"t" в параметре MODE).
328
10.5
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
MEM
Устройство типа MEM оперирует внутренними буферами памяти. Процессы MiniM могут обмениваться данными через устройство такого типа таким образом, что данные, посылаемые через устройство, находятся
только в памяти и не сохраняются на диск, не отсылаются по сети и не
выводятся ни на какое периферийное устройство. Устройства типа MEM
организуют внутренний канал передачи данных между двумя процессами.
Устройство типа MEM может иметь произвольное имя, следующее
за префиксом типа устройства. Оба процесса, обменивающиеся информацией, должны указать одно и то же имя. Процесс, первым открывший
устройство типа MEM, считается по отношению к этому устройству
серверным. Другой процесс, открывший устройство с этим же именем,
считается по отношению к этому устройству клиентским.
Для MEM устройства серверным процессом может быть только один.
При закрытии им устройства канал уничтожается. Клиентский процесс
может быть только один в один момент времени. После того, как клиентский процесс открыл устройство типа MEM, никакой другой процесс
не сможет его открыть. После того, как клиентский процесс закрыл
устройство типа MEM, записанные им в устройство, но не прочитанные
сервером данные пропадают.
Если клиентский процесс не подключён к устройству, то серверный
процесс не может записать в устройство никакие данные, и при попытке
записи встаёт в ожидание, пока к устройству не подключится клиентский процесс. После того, как клиентский процесс закрыл устройство
типа MEM, к этому же устройству может подключиться другой процесс, и он автоматически становится клиентским. При этом, этот второй
процесс не может прочитать данные, отправленные серверным процессом
предыдущему клиентскому процессу.
Устройства типа MEM игнорируют значение параметра тайм-аута при
открытии, но при его указании переменная $test принимает значение 1
или 0, в зависимости от успешности открытия и подключения к устройству.
Параметры команды open
Параметр /MODE
Параметр задаётся строкой, в которой символы означают режим открытия. Символы (флаги открытия) могут быть указаны в произвольном
порядке и используются нечувствительно к регистру. Параметр является
10.5. MEM
329
позиционным первым, если используется без имени.
r
w
t
b
Открыть устройство на чтение. Флаг может комбинироваться с флагом w.
Открыть устройство на запись. Флаг может комбинироваться с флагом r.
Открыть в текстовом режиме. Нельзя комбинировать
с флагом b.
Открыть в бинарном режиме. Нельзя комбинировать
с флагом t.
При открытии устройства в бинарном режиме терминатором чтения
по умолчанию является пустая строка. Если задан терминатор чтения, то
он используется. Если устройство открыто в текстовом режиме, то терминатором чтения является символ $c(10). Если при прочтении строки
до этого символа её последним символом оказался $c(13), то он изымается из прочитанной строки, и строка возвращается командой чтения.
Символ $c(13) в других позициях не удаляется. Строка возвращается
без терминаторов. Если устройство открыто в текстовом режиме, то параметр /TERM игнорируется, даже если он указан.
Параметр /MODE указывается либо по имени в любой позиции, либо
без имени в первой позиции. Параметр /MODE всегда должен иметь
значение.
Примеры:
s dev="|MEM|mnm srv sample"
o dev:("rwt")
o dev(/MODE="RWT")
Если параметр /MODE не указан, то устройство типа MEM открывается с разрешением чтения и записи и в бинарном режиме.
Параметр /MODE может быть указан различным для серверного и
клиентского процессов, каждая сторона будет поступать так, как указано
в параметрах.
Параметр /TERM
Параметр задаёт терминатор чтения при открытии устройства в бинарном режиме. Если параметр не задан, то считается пустая строка,
и чтение выполняется либо на заданную длину, либо на максимально
допустимый размер локальной переменной (32K).
Параметр терминатор задаётся либо позиционным вторым, либо именованным в любой позиции.
330
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Параметр терминатор, если указывается, то обязательно должен иметь
значение. Значение может быть задано произвольным вычисляемым выражением.
При открытии устройства в текстовом режиме терминатор чтения
игнорируется.
Параметр /TERM может быть указан различным для серверного и
клиентского процессов, каждая сторона будет поступать так, как указано
в параметрах.
Параметр /BUF
Параметр указывает размер внутреннего буфера для обмена данными в байтах. Если размер буфера исчерпан записывающим процессом,
а читающий ещё не все прочитал, то записывающий процесс встаёт в
ожидание, пока читающий процесс не вычитает некоторое количество
байт, чтобы освободилось место для записи.
Минимальное значение параметра - 512, максимальное - 1048576.
Если указано значение меньше минимального, то будет использовано
минимальное значение, если указано больше максимального, то будет
использовано максимальное. Если параметр не указан, то считается значение по умолчанию 65536.
Увеличение размера буфера приводит к увеличению занимаемой процессами памяти.
Указание размера буфера используется только серверным процессом,
клиентские процессы это значение вычисляют, но не используют.
Параметры команды use
Команда use применительно к устройству MEM принимает параметры:
/TERM
/MODE
Меняет текущий терминатор бинарного
режима.
Меняет текущий режим.
Остальные параметры игнорируются.
Позиционность параметров. Параметр /MODE может быть использован позиционно в первой позиции, параметр /TERM позиционно во
второй позиции.
Параметры команды close
У команды закрытия устройства MEM параметры не поддерживаются, а если они указаны, то игнорируются. При закрытии устройства клиентским процессом устройство остаётся работать со стороны серверного
10.6. NULL
331
и готово принять подключение другого клиентского процесса. При закрытии устройства серверным процессом операции ввода-вывода со стороны клиентского процесса приводят к генерации ошибки <DEVICE>.
MiniMono difference
В MiniM Embedded Edition устройство |MEM| не поддерживается.
10.6
NULL
Устройства типа NULL есть устройства, которые не имеют отсылки данных и приёма данных извне. При обращении к устройству NULL на
запись команда сразу возвращает управление. При обращении на чтение
строки сразу читается пустая строка, а при чтении символа читается код
-1.
Процесс может открыть несколько NULL устройств. Их следует различать именами. Имя устройства или строка идентификации формируются указанием типа устройства NULL, после которого могут следовать
произвольные символы, определённые программистом. Например:
TEMP>s dev="|NULL|" o dev
TEMP>s dev2="|NULL|2" o dev2
Здесь открывается два NULL устройства, с именами "|NULL|" и
"|NULL|2".
NULL устройства используются в целях утрачивания ввода-вывода
вызываемых программ.
Параметры команд open, use, close
MiniM игнорирует любые параметры команд open, use, close при оперировании NULL устройствами.
При запуске нового процесса командой job, если для него не было
указано использование конкурентного TCP сокета, устройством вводавывода по умолчанию является устройство NULL.
10.7
PIPE
Устройство ввода-вывода PIPE выполняет запуск консольного приложения с перенаправлением ввода-вывода. Запущенное приложение принимает на входе то, что процесс MiniM пишет в PIPE устройство команда-
332
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
ми write, и процесс MiniM получает вывод запущенного процесса через
команды read.
Строка идентификации устройства формируется из строки "|PIPE|",
после которой следует имя файла, запускаемого приложения, и его параметры командной строки. Например, получить список файлов текущего
каталога без служебной информации:
"|PIPE|dir /b"
Многие утилиты операционной системы Windows и другие программы поддерживают работу в неинтерактивном режиме и обмениваются данными с родительским процессом через стандартные механизмы
ввода-вывода. Например, запуск команды dir операционной системы с
различными ключами производит вывод оглавления каталогов на стандартное устройство вывода. При запуске из консоли вывод осуществляется в консоль, при запуске с перенаправлением вывода вывод производится в указанный файл. Этот же механизм применяется и в устройстве
PIPE, но вывод принимается процессом MiniM через команды чтения из
устройства. Например:
>s dev="|PIPE|set" o dev
>u dev f r a s s($i(s))=a
>c dev
В этом примере создаётся PIPE устройство для перехвата вывода команды set без параметров. Прочитанные строки сохраняются в локальной переменной s. Чтение прекращается при генерации командой чтения
read ошибки <ENDOFFILE>. Данный код предполагает, что текущая
настройка сервера TrapOnEof установлена в значение по умолчанию 1.
>s mode=$v("proc",5,0)
>s dev="|PIPE|set" o dev
>u dev f r a q:$zeof s s($i(s))=a
>c dev s mode=$v("proc",5,mode)
В этом примере явно устанавливается режим обработки TrapOnEof
= 0 для текущего процесса, и в этом случае код проверяет значение
системной переменной $zeof после выполнения команды чтения. После
чего устанавливается предыдущее значение настройки TrapOnEof, сохраненное в переменной mode.
Параметры команды open
Применительно к устройству PIPE, команда open поддерживает параметры:
10.7. PIPE
/MODE = expr
/TERM = expr
/DIR = expr
333
Режим открытия устройства - текстовый
или бинарный, чтение, запись.
Терминатор чтения для бинарного режима.
Каталог, в котором запускать дочерний
процесс.
Параметр /MODE = expr
Параметр /MODE задаёт режим открытия устройства. Выражение
expr вычисляется как строка и рассматривается как набор символьных
флагов. В строке рассматриваются символьные флаги:
r или R
w или W
t или T
b или B
иное
Задаёт разрешение на чтение из устройства.
Задаёт разрешение на запись в устройство.
Включает текстовый режим чтения - записи.
Включает бинарный режим чтения - записи.
Игнорируется
Если параметр не указан, то считается режим по умолчанию rt, разрешение на чтение, запрет на запись и текстовый режим чтения.
Если в строке не указан режим текстовый или бинарный, то по
умолчанию устанавливается текстовый. Если не указано разрешение ни
на чтение, ни на запись, то обе команды будут генерировать ошибки
<READ> или <WRITE> соответственно.
При влючении текстового режима вывод перевода строки
write !
выводит в устройство символы $c(13,10), а при включении бинарного
режима только $c(10).
Параметр /MODE может задаваться позиционно в первой позиции
или именованно в любой позиции.
Параметр /TERM = expr
Параметр /TERM задаёт терминатор чтения строки для бинарного
режима. Выражение expr вычисляется как строка и используется как
терминатор. При чтении строки терминатор не входит в прочитанное
значение.
Для текстового режима задание терминатора игнорируется. Терминатором текстового режима служит символ $c(10). Если перед ним прочитан символ $c(13), то он также изымается из прочитанной строки.
Значение терминатора по умолчанию - пустая строка.
334
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Параметр /TERM может задаваться как позиционный во второй позиции, как и именованный в любой позиции.
Параметр /DIR = expr
Параметр /DIR задаёт имя каталога, который должен быть текущим
для запускаемого дочернего процесса. Выражение expr вычисляется как
строка и используется как имя каталога.
Параметр /DIR может задаваться как позиционный в третьей позиции, так и именованный в любой позиции.
Параметры команды use
Команда use применительно к устройству PIPE принимает только
один именованный параметр /TERM = expr. Параметр изменяет установленный для устройства текущий терминатор чтения, если устройство
было открыто в бинарном режиме. Иначе параметр игнорируется. Команда use не может изменить режим устройства на чтение или на запись,
текстовый или бинарный.
Параметр /TERM в команде use для устройства PIPE может быть
использован только именованно в любой позиции.
Остальные параметры игнорируются.
Параметры команды close
Команда close применительно к устройству PIPE принимает только один именованный параметр /TERMINATE без значения. Остальные
параметры игнорируются. Если параметр /TERMINATE присутствует в
параметрах, то при закрытии устройства процесс MiniM уничтожает порождённый процесс, если он к тому времени еще не завершил работу.
10.8
PRN
Устройства типа |PRN| поддерживаются только в Windows - версиях
MiniM Database Server и MiniMono.
Устройство типа |PRN| создается для вывода данных на принтер и
установки опций печати.
Устройство работает только в режиме записи, при выполнении команд
чтения из него генерируется ошибка <READ>.
Параметры печати для устройства |PRN| задаются только для команды open. Опции команд use и close применительно к устройству |PRN|
игнорируются.
Часть устройств вывода работающие как принтеры, но принтерами
не являющиеся, например виртуальные принтеры или факсы, при своей
10.8. PRN
335
работе могут выводить диалоговые окна для уточнения параметров, например имя файла pdf для сохранения. Нужно проверить для каждого
используемого такого типа принтера, в каком пользовательском аккаунте вызывается это диалоговое окно (или несколько) и принять меры к
настройке аккаунта работы процессов сервера MiniM. Кроме того, следует уточнить имеются ли у аккаунтов процессов MiniM полномочия
выводить на сетевые принтеры.
Именование устройства |PRN|
Для задания принтера программа должна указать после типа устройства |PRN| его имя в том виде, в каком этот принтер определен в
Windows. Если указана пустая строка
s printer="|PRN|"
то используется принтер на текущем компьютере, назначенный принтером по умолчанию. Примеры использования имен принтеров:
s dev="|PRN|Acrobat Distiller"
s dev="|PRN|Fax"
s dev="|PRN|EPSON TX117_119"
Для использования сетевого принтера нужно указывать имя компьютера и имя принтера так как он объявлен в сети, в формате UNC. Пример
использования принтера "HP LaserJet 5P" на сервере "NTServer":
s dev="\\NTServer\HP LaserJet 5P"
Параметры команды open
Все параметры устройства |PRN| используются только как именованные и могут быть указаны в произвольном порядке. Позиционные
параметры игнорируются.
В команде open применительно к устройству PRN поддерживаются
параметры (все параметры необязательные и поддерживаются принтером
в зависимости от его возможностей):
/MODE
/OUTPUTFILE
/DOCNAME
Задает режим открытия устройства - текстовый или бинарный
Задает имя файла, в который будет свормирован образ печати
Задает имя задачи печати
336
/ORIENTATION
/COPIES
/QUALITY
/COLOR
/DUPLEX
/COLLATE
иное
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Задает ориентацию бумаги при печати
Задает количество копий
Задает качество печати
Задает цвет печати - цветной или чернобелый
Задает дуплексность печати
Задает способ разбора напечатанных страниц
Игнорируется.
Параметр /MODE = expr
Значение expr вычисляется как строка. Если в строке присутствует
символ "t" или "T" то устройство открывается в текстовом режиме. Если
присутствует символ "b" или "B" то устройство открывается в бинарном
режиме. Бинарный режим соответствует принтерному формату "RAW",
текстовый соответствует формату "TEXT". Если параметр /MODE не
указан или в значении expr не найдены символы "t", "T", "b", "B" то
устройство открывается в режиме текстовый, это значение по умолчанию.
Параметр /OUTPUTFILE = expr
Если параметр указан, то вывод образа печати производится в файл,
указанный в значении expr. Поддержка данной опции выполняется драйвером принтера. По умолчанию, если параметр не указан, вывод в файл
не производится.
Параметр /DOCNAME = expr
Если параметр указан, то значение expr задает имя задачи печати.
Если параметр не указан, то используется имя задачи печати по умолчанию "MiniM".
Параметр /ORIENTATION = expr
Если параметр указан, то значение expr вычисляется как строка.
Значения параметра:
"PORTRAIT"
"LANDSCAPE"
иное
Печать с вертикальной ориентацией страницы.
Печать с горизонтальной ориентацией
страницы.
Игнорируется, используются настройки
принтера по умолчанию.
10.8. PRN
337
Значение параметра используется нечувствительно к регистру. Если
параметр не указан, то используются настройки принтера по умолчанию.
Параметр /COPIES = expr
Если параметр не указан, используется количество копий по умолчанию. Если параметр указан, то значение expr вычисляется как целое
число. Если значение меньше или равно 0, то используется значение 1.
Полученное значение задает количество копий, которое следует напечатать. Поведение печати при задании количества копий определяется
используемым принтером и зависит от его возможностей.
Параметр /QUALITY = expr
Параметр задает качество печати. Если параметр не указан, используется качество печати установленное для принтера по умолчанию. Если
указан, то значение expr вычисляется как строка. Значения параметра:
"HIGH", "MEDIUM", "LOW", "DRAFT". Значения этого параметра сравниваются нечувствительно к регистру. Иные значения игнорируются и в
этом случае используется настройка принтера по умолчанию. Характер
использования настройки качества печати определяется возможностями
используемого принтера.
Параметр /COLOR = expr
Параметр задает цветность печати. Если параметр не указан, то принтер использует настройку по умолчанию. Если параметр указан, то значение expr вычисляется как строка и сравнивается с значениями:
"COLOR"
"MONOCHROME"
иное
Указание выполнять печать в цвете.
Указание выполнять печать в градациях
серого.
Игнорируется и принтер использует текущие настройки.
Поддержка цветности печати выполняется принтером в зависимости
от его возможностей.
Параметр /DUPLEX = expr
Параметр задает значение, определяющее, будет ли печать на странице производиться с обеих сторон (если принтер поддерживает эту функцию). При использовании горизонтальной двусторонней печати верхние
края обеих сторон страницы находятся на одном краю листа бумаги.
При использовании вертикальной двусторонней печати нижний край одной страницы находится на том же краю листа, что и верхний край
338
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
другой страницы. Значения пераметра:
"Simplex"
"Horizontal"
"Vertical"
иное
Односторонняя печать с текущими параметрами ориентации.
Двусторонняя горизонтальная печать с горизонтальным расположением страниц.
Двусторонняя печать с вертикальным расположением страниц.
Игнорируется и принтер использует текущие настройки.
Значение параметра используется нечувствительно к регистру.
Параметр /COLLATE = expr
Параметр задает опцию разбора по копиям (если принтер поддерживает данную возможность). Значение параметра expr вычисляется как
целое число и сравнивается с нулем. Если значение expr приводится к
нулю, то разбор по копиям отключается. Иначе включается. Если параметр /COLLATE не указан, то используется настройка принтера по
умолчанию.
Особенности команды write для устройства |PRN|
write !
При работе в текстовом режиме в принтер выводятся символы $c(13,10),
при работе в бинарном режиме выводится символ $c(10).
write #
Команда write # эквивалентна выводу в принтер символа перевода
страницы $c(12). При работе в бинарном режиме это следует учитывать
при формировании страниц.
write ?N
При работе в текстовом режиме выводятся пробелы дополняющие
текущую позицию до указанной в значении N. При работе в бинарном
режиме выводится указанное в значении N число пробелов.
При закрытии устройства типа |PRN| сервер формирует команды
окончания печати документа и печать завершается.
10.9. STD
10.9
339
STD
Устройство STD создаётся автоматически при запуске процесса с перенаправлением ввода-вывода или с опцией командной строки -std.
При этом, в первом случае ввод выполняется из перенаправленного
ввода, вывод - в перенаправленный вывод. По окончании ввода процесс
завершается.
Во втором случае сначала проверяется, указано ли исполнение команд из строки в параметре -x, или нескольких строк в параметре -x,
с косвенным указанием имени файла. Если указаны команды для выполнения, то они выполняются, как если бы были введены вручную
интерактивно. После их выполнения проверяется, был ли задан параметр останова -h. Если задан, то процесс завершается. Если останов не
был задан явно, то процесс переходит в режим ввода-вывода с консоли
Windows.
Устройство STD не может быть создано явно и не может быть закрыто, поскольку является устройством по умолчанию. К устройству STD
применимы лишь команды use.
Параметры команды use
В команде use применительно к устройству STD поддерживаются
параметры:
/TERM = expr
/MODE = expr
иное
Параметр задаёт терминатор чтения.
Параметр задаёт режим ввода-вывода текстовый или бинарный.
Игнорируется.
Параметр /MODE = expr
Параметр /MODE = expr задаёт режим ввода - вывода. Выражение
expr вычисляется как строка, и она должна содержать 1 символ.
t или T
b или B
иное
Переключиться в текстовый режим.
Переключиться в бинарный режим.
Генерируется ошибка <DEVPARAM>.
В текстовом режиме ввода терминатора является символ ввода $c(10).
Если перед ним был встречен символ $c(13), то он, также как и терминатор $c(10), не включается в строку при чтении строки. При создании
устройства ему назначается текстовый режим ввода. При чтении строк
команд из файла, заданного в параметре -x, терминатор игнорируется, и
340
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
содержание файла при выборке очередной строки для исполнения считается текстовыми строками вне зависимости от применения команды
use.
В бинарном режиме терминатором чтения считается терминатор, заданный программистом. По умолчанию терминатор отсутствует.
Устройство STD не поддерживает тайм-ауты при чтении. Указанный
в команде тайм-аут игнорируется. Если тайм-аут был задан, то переменная $test при чтении принимает значение 1, но чтение выполняется
независимо от заданного времени.
MiniMono difference
В MiniM Embedded Edition устройство |STD| не поддерживается.
10.10 STORE
Устройство типа |STORE| оперирует данными, хранящимися в локальной или глобальной переменной. При записи в это устройство данные
дописываются в указанное место хранения, при чтении вычитываются.
Строка идентификации устройства формируется как |STORE|glvn,
где glvn - имя локальной или глобальной индексированной переменной
с одним или более индексами. Например:
s dev1="|STORE|stream("""")"
s dev2="|STORE|"_$na(^mtempRun($j,""))
Устройство |STORE| при чтении переходит от одного узла к другому используя функцию $order. Начальное значение последнего индекса
задает начальное значение, от которого будет выполнен первый переход по $order. Этот переход выполняется автоматически при открытии
устройства и устройство автоматически позиционируется на следующий
индекс. При записи значение следующего индекса формируется автоматически приращением на единицу предыдущего значения.
Устройство типа |STORE| может быть открыто либо в режиме записи
либо в режиме чтения. При переходе в режим записи устройство автоматически удаляет все значения в локальной или глобальной переменной
лежащие после текущей позиции.
Все операции с глобалами выполняются в текущем транзакционном
контексте и к ним применяются все соглашения по выполнению команды
set.
Параметры устройства |STORE|
10.10. STORE
341
Параметр /MODE=expr
Параметр /MODE задаёт режим открытия устройства. Выражение
expr вычисляется как строка и рассматривается как набор символьных
флагов. В строке рассматриваются символьные флаги:
r или R
w или W
t или T
b или B
иное
Задаёт разрешение на чтение из устройства.
Задаёт разрешение на запись в устройство.
Включает текстовый режим чтения - записи.
Включает бинарный режим чтения - записи.
Игнорируется
Если параметр не указан, то при открытии используется режим по
умолчанию "wt", разрешение на запись, запрет на чтение. При этом из
указанной локальной или глобальной переменной удаляются все данные
после указанного имени.
Можно включать режим либо чтение либо запись и либо текстовый
либо бинарный.
Параметр /MODE может быть использован как в именованной форме,
так и позиционно, в первой позиции опций команд open и use.
При включении бинарного режима команда
write !
дописывает символ $c(10), при включении текстового дописывает
символы $c(13,10).
Параметр /TERM=expr
Параметр /TERM задаёт терминатор чтения строки для бинарного
режима. Выражение expr вычисляется как строка и используется как
терминатор. При чтении строки терминатор не входит в прочитанное
значение.
Для текстового режима задание терминатора игнорируется. Терминатором текстового режима служит символ $c(10). Если перед ним прочитан символ $c(13), то он также изымается из прочитанной строки.
Значение терминатора по умолчанию - пустая строка.
Параметр /TERM может задаваться как позиционный во второй позиции, как и именованный в любой позиции.
Параметр /EOL=expr
Параметр /EOL задает режим трактовки окончания строки в текущем
используемом узле. Параметр применяется только для текстового режима. Значение expr вычисляется как целое число и сравнивается с нулем.
342
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Если не равно нулю, то в текстовом режиме конец текущей строки при
чтении рассматривается как терминатор чтения, а при записи команда write ! в текстовом режиме приводит к автоматическому переходу к
следующему узлу с автоматическим приращением значения последнего
индекса.
При открытии устройства параметр по умолчанию равен 1.
Параметр /EOL может быть указан как в именованной форме, так и
позиционно в третьей позиции для команд open и use.
Команда close для устройства |STORE| игнорирует параметры.
Пример использования устройства |STORE|:
USER>s dev="|STORE|abc(12)" o dev
USER>u dev w 456,!,789 u 0 c dev w
abc(13)="456"
abc(14)="789"
dev="|STORE|abc(12)"
Здесь открывается устройство типа |STORE| в режиме записи, в текстовом режиме, в режиме трактовать перенос строки как переход к
следующему индексу (/MODE="wt":/EOL=1), и указывается что нужно использовать локальную переменную abc с индексами после 12. В
устройство выводится строка 456, потом перенос строки, потом строка
789 и устройство закрывается. Таким образом в локальной переменной
abc(13) и abc(14) сохраняются выводимые строки.
10.11
TCP
Устройство типа TCP оперирует сокетами TCP/IP. Используются операции открытия сокета, чтения и записи данных. Могут быть открыты как
сокеты клиентской стороны, так и серверной.
Устройство типа сокет идентифицируется строками, начинающимися
с подстроки TCP, после которой следует либо адрес и порт, либо имя
компьютера и порт, либо порт. По полному имени процесс MiniM различает операции с серверным и клиентским сокетом. Имена устройств
отличаются по регистру, поэтому при задании имени компьютера программисту следует обратить внимание на регистр имени компьютера.
Правила именования
10.11. TCP
343
|TCP|
Устройство создано автоматически
для процесса, созданного командой
job с передачей сокета.
Создаётся серверный сокет на этот
порт.
Открывается клиентский сокет и соединяется с этим сервером и на этот
порт.
Открывается клиентский сокет и соединяется с этим адресом и на этот
порт.
|TCP|:port
|TCP|server:port
|TCP|address:port
Примеры:
s dev="|TCP|:80" o dev
s dev="|TCP|www.server.com:80" o dev
s dev="|TCP|127.0.0.1:80" o dev
Здесь открываются устройства TCP для порта 80. В первом случае
серверный сокет открывает порт, и после открытия устройство переходит
в режим готовности принимать и отсылать данные. Во втором случае
устройство соединяется с портом 80 на компьютере www.server.com и
после открытия готово отослать и принять данные. В третьем случае
устройство соединяется с портом 80 по адресу 127.0.0.1 и после открытия
готово отослать и принять данные.
Устройства типа TCP игнорируют параметр тайм-аута открытия, поскольку технически не могут прервать открытие сокета ранее, чем истечёт заданный тайм-аут. Но если тайм-аут указан, то при неуспехе
открытия сокета переменная $test принимает значение 0, иначе 1.
MiniM поддерживает задание как позиционных, так и именованных
параметров. Если значение параметра указано без имени, то используется по позиции, иначе параметр может быть указан с именем и в
произвольной позиции.
Параметры команды open
/SOCKET
/MODE
/TERM
Задание номера сокета, открытого внешними по отношению к устройству средствами и принадлежащего текущему процессу.
Режим использования данных при чтении и записи
в устройство
Строка - терминатор чтения.
344
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Параметр /MODE
Параметр задаётся строкой, в которой символы означают режим открытия. Символы (флаги открытия) могут быть указаны в произвольном
порядке и используются нечувствительно к регистру.
r
w
t
b
Открыть сокет на чтение. Флаг может комбинироваться с флагом w.
Открыть сокет на запись. Флаг может комбинироваться с флагом r.
Открыть в текстовом режиме. Нельзя комбинировать
с флагом b.
Открыть в бинарном режиме. Нельзя комбинировать
с флагом t.
Параметр /MODE указывается либо по имени в любой позиции, либо
без имени в первой позиции. Параметр /MODE всегда должен иметь
значение.
Примеры:
s dev="|TCP|:80"
o dev:("RW")
o dev(/MODE="RWT")
Здесь в первом случае открывается сокет на чтение и запись в бинарном режиме, и параметр режима открытия задаётся позиционно, во
втором случае устройство открывается на чтение и запись в текстовом
режиме, и параметр задаётся именованно.
Если параметр /MODE не указан, то по умолчанию считается режим
открытия на чтение и запись в бинарном режиме.
Параметр /SOCKET
Синтаксис:
/SOCKET=socknumber
Параметр /SOCKET задаёт использование открытого внешними по
отношению к устройству средствами сокета по его номеру, возвращенному операционной системой. При задании этого параметра устройство
использует указанный сокет для операций ввода-вывода и не открывает
новый. При закрытии устройства этот сокет закрывается.
10.11. TCP
345
Параметр /SOCKET не имеет позиционной формы, может использоваться только в именованной форме и обязательно должен иметь значение. Значение может быть задано произвольным вычисляемым выражением.
Параметр /TERM
Параметр задаёт терминатор чтения при открытии устройства в бинарном режиме. Если параметр не задан, то считается пустая строка,
и чтение выполняется либо на заданную длину, либо на максимально
допустимый размер локальной переменной (32K).
При открытии устройства в бинарном режиме терминатором чтения
по умолчанию является пустая строка. Если задан терминатор чтения, то
он используется. Если устройство открыто в текстовом режиме, то терминатором чтения является символ $c(10). Если при прочтении строки
до этого символа её последним символом оказался символ $c(13), то
он изымается из прочитанной строки, и строка возвращается командой
чтения. Символ $c(13) в других позициях не удаляется. Строка возвращается без терминаторов. Если устройство открыто в текстовом режиме,
то параметр /TERM игнорируется, даже если он указан.
Параметр терминатор задаётся либо позиционным вторым, либо именованным в любой позиции.
Параметр терминатор, если указывается, то обязательно должен иметь
значение. Значение может быть задано произвольным вычисляемым выражением.
При открытии устройства в текстовом режиме терминатор чтения
игнорируется.
Параметры команды use
Команда use применительно к устройству TCP принимает параметры:
/TERM
/MODE
/ACCEPT
/ATO
Меняет текущий терминатор бинарного
режима.
Меняет текущий режим.
Выполняет операцию accept для сокета.
Таймаут ожидания входящего коннекта
Остальные параметры игнорируются.
Позиционность параметров. Параметр /MODE может быть использован позиционно в первой позиции, параметр /TERM позиционно во
второй позиции. Параметр /ACCEPT может быть использован только
именованно.
346
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Параметр /ACCEPT
Параметр /ACCEPT не имеет значения. При применении параметра
/ACCEPT выполняется операция /ACCEPT для TCP/IP сокета устройства. Принятый сокет запоминается во внутренних данных устройства.
Если ранее был принят новый сокет параметром /ACCEPT, то он закрывается, забывается и замещается новым значением.
Номер сокета, полученный командой use с параметром /ACCEPT, может быть получен функцией $view("dev",2) для текущего устройства или
$view("dev",2,devstr) для устройства, указанного значением выражения
devstr.
Номер сокета, полученный командой use с параметром /ACCEPT,
может быть использован командой job при запуске нового процесса с
передачей ему конкурентного сокета.
Параметр /ATO
Параметр /ATO указывает тайм-аут ожидания выполнения операции
/ACCEPT. Параметр используется только, если был указан параметр
/ACCEPT. Параметр обязательно должен иметь значение. Значение вычисляется как число и означает количество секунд, сколько ожидать
выполнения /ACCEPT.
Данный тайм-аут применяется только и исключительно к ожиданию
/ACCEPT и ни к чему иному. Если параметр /ATO указан совместно
с /ACCEPT, то по выполнении команды use процесс устанавливает системную переменную $test в значение 1, если операция /ACCEPT выполнилась успешно, и в значение 0, если неуспешно. Если параметр /ATO
не указывается, то значение системной переменной $test не изменяется.
Параметры команды close
У команды закрытия устройства TCP параметры не поддерживаются,
а если они указаны, то игнорируются. Открытые сокеты закрываются.
10.12
TNT
Устройство TNT - это устройство ввода-вывода, создаваемое автоматически при запуске процесса MiniM в режиме телнета. Клиентская программа telnet или аналог производит обмен с серверной частью по протоколу
TCP/IP. Устройство TNT обеспечивает сопряжение протокола telnet с
программной моделью устройства ввода-вывода MiniM.
TNT устройство создаётся автоматически при запуске процесса MiniM
и при подключении telnet-клиента. Устройство является устройством по
10.12. TNT
347
умолчанию и не может быть закрыто. Устройство TNT нельзя создать
программно, оно создаётся автоматически. Формат строки идентификации устройства включает строку "|TNT|", после которой следует некоторое число. Это число означает внутренний номер сокета TCP/IP. Строка идентификации остаётся неизменной в течение всего времени жизни
процесса.
Устройство TNT не поддерживает никакие параметры команд open и
close.
Параметры команды use
В команде use применительно к устройству TNT поддерживаются
параметры:
/COLUMNS = expr
/LINES = expr
/ECHO = expr
/TERM = expr
/CTRLC = expr
/MODE = expr
иное
Использовать указанное количество колонок.
Использовать
указанное
количество
строк.
Использовать или нет режим эха.
Терминатор чтения строки
Генерировать ли прерывание при нажатии
Ctrl+C
Использовать текстовый (t) или бинарный
(b) режим
Игнорируется
Параметр /COLUMNS = expr
Параметр /COLUMNS = expr задаёт, сколько колонок использовать
при вводе-выводе. Если параметр не указан, то используется текущее
значение. При создании устройства значение по умолчанию 80.
Параметр /COLUMNS = expr может задаваться как позиционно в
первой позиции, так и именованно в любой позиции.
Значение expr вычисляется как целое число. Если число получается
меньше или равно 0, то генерируется ошибка <DEVPARAM>.
Параметр /LINES = expr
Параметр /LINES = expr задаёт, сколько строк использовать при
вводе-выводе. Если параметр не указан, то используется текущее значение. При создании устройства значение по умолчанию 25.
Параметр /LINES = expr может задаваться как позиционно во второй
позиции, так и именованно в любой позиции.
348
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
Значение expr вычисляется как целое число. Если число получается
меньше или равно 0, то генерируется ошибка <DEVPARAM>.
Оба параметра /LINES и /COLUMNS не переключают режим работы
телнет-клиента, их параметры используются только при форматировании
ввода-вывода.
Параметр /ECHO = expr
Параметр /ECHO = expr задаёт режим повтора ввода на экране. Если параметр не указан, то используется текущий режим. При создании
устройства режим эха включен.
Значение expr вычисляется как целое число. Если результат равен
нулю, то режим эха отключается, иначе - включается. При подавлении
эха ввод пользователя не приводит к выводу символов на экран.
Параметр /ECHO может задаваться как позиционно в третьей позиции, так и именованно в любой позиции.
Параметр /CTRLC = expr
Параметр /CTRLC = expr включает или отключает генерацию ошибки
прерывания <INTERRUPT> при вводе клавишной комбинации Ctrl+C.
Если значение expr вычисляется как ноль, то генерация прерывания выключается и нажатие Ctrl+C может быть считано командой чтения. Если
не ноль, то включается генерация прерывания <INTERRUPT> при нажатии Ctrl+C. По умолчанию генерация прерывания включена. Параметр
/CTRLC должен иметь значение expr. Применение параметра /CTRLC
возможно только именованно, позиционная форма не поддерживается.
Параметр /MODE = expr
Параметр /MODE = expr переключает режим приема символов от
телнет-клиента. Различается текстовый (t или T) и бинарный (b или
B). По умолчанию устройство работает в текстовом режиме. При переключении в бинарный отключается реакция на прерывание Ctrl+C, но
настройка сохраняется и реакция восстанавливается при возвращении в
текстовый режим.
Значение expr вычисляется как строка и используется первый символ нечувствительно к регистру. Если символ t или T то включается
текстовый режим, если символ b или B, то включается бинарный.
В бинарном режиме отключается редактирование вводимой строки
для команды чтения строки и любое распознавание входных эскейппоследовательностей. Команды чтения символа помещает прочитанный
10.12. TNT
349
символ также в системную переменную $KEY. Команда чтения строки
помещает в системную переменную $KEY значение терминатора чтения
если он указан.
Параметр /MODE = expr для устройства TNT не имеет позиционной
формы и поддерживается только именованная форма - имя параметра
необходимо указывать явно в любой позиции.
Пример чтения символов в бинарном режиме:
u $p:(/mode="b":/term="":/echo=0)
k ^CH
f i=1:1:16 r *ch s ^CH($i(^CH))=ch
u $p:(/mode="t":/echo=1)
zw ^CH
Пример чтения строк в бинарном режиме при установке терминатора
строки перевод строки:
u $p:(/mode="b":/term=$c(10):/echo=0)
k ^STR
f i=1:1:5 r str s ^STR($i(^STR))=$zquote(str)
u $p:(/mode="t":/echo=1)
zw ^STR
Параметр /TERM = expr
Параметр /TERM = expr задает терминатор чтения строки. Чтение
строки заканчивается, если строка при ее вводе завершается указанной
в параметре строкой. Параметр /TERM для устройства телнета задается
только именованно, и не имеет позиционного представления. В случае,
если задается значение параметра равное пустой строке, то терминатор
удаляется и не используется. При вводе командной строки в командном
режиме заданный командой use терминатор чтения не используется и
при возврате в строку ввода команды терминатор не забывается и продолжает применяться при выполнении команд.
Терминаторы чтения
Терминаторами чтения в устройстве TNT при вводе командной строки
являются символ ввода (ENTER) и символ отмены ввода (ESC). Они
же являются терминаторами если установлен терминатор чтения пустая
строка. На ненулевом уровне стека, если установлен терминатор чтения,
то используется он.
350
ГЛАВА 10. ПАРАМЕТРЫ УСТРОЙСТВ
При работе в режиме ввода строки в текстовом режиме (по умолчанию) работает внутренний редактор строки, формирующий необходимые
по протоколу telnet escape - последовательности. При чтении производится чтение символов из TCP/IP сокета.
MiniMono difference
В MiniM Embedded Edition устройство |TNT| не поддерживается.
Глава 11
Обработка ошибок
11.1
Средства обработки ошибок
Для обработки ошибок предоставляются системные переменные и поведенческая модель выполнения программы. К системным переменным
обработки ошибок относятся:
$zerror
$ecode
$estack
$etrap
$stack()
Показывает расширенное значение последней ошибки как стандартных ошибок
MiniM, так и дополнительных.
Содержит перечень последних произошедших ошибок в виде их кодов, либо при
присваивании не пустой строке позволяет
генерировать ошибку.
Индикатор уровня стека, относительно последней выполненной команды new
$estack.
Содержит код, выполняющийся при возникновении ошибки.
Возвращает информацию о выполнении
процесса и о последовательности действий, приведших к состоянию ошибки.
К расширенным средствам обработки ошибок относится функция
$view("err"):
351
352
$view("err",1)
$view("err",2,code)
ГЛАВА 11. ОБРАБОТКА ОШИБОК
Возвращает место возникновения последней произошедшей ошибки, относительно
исходных текстов MiniM. Эта информация
может помочь разработчикам определить,
при необходимости, причины проблем более точно.
Возвращает расширенное текстовое описание стандартной ошибки в перечне MDC
и поддерживаемой системой MiniM.
Управление обработкой ошибок производится присваиванием значений системным переменным $ecode и $etrap, а также применением команды new к системным переменным $estack и $etrap. В отношении
системной переменной $etrap команда new может быть совмещена с операцией присваивания в инициализирующей форме команды new. Системная переменная $zerror доступна только на чтение, и ей не может быть
присвоено значение, а также нельзя создать её копию на стеке командой
new.
Команда break в настоящей версии MiniM не поддерживается. При
её выполнении, в любой форме как с аргументами, так и без них, генерируется ошибка <UNIMPLEMENTED>.
В текущей версии MiniM имплементирует только те средства обработки ошибок, которые были определены в стандарте языка M[UMPS]
в редакции ANSI MDC X11.1-1995, он же, без изменений содержания,
ныне действующий стандарт ISO M[UMPS]. В текущей версии не поддерживаются расширенные средства обработки ошибок, введённые и
поддерживаемые другими М-системами, но в будущем их поддержка
системой MiniM может быть изменена в сторону расширения и с целью
поддержки переносимости программ.
11.2 Схема обработки ошибок
При возникновении ошибки система MiniM определяет значение системной переменной $etrap, действующее на текущем уровне стека. При создании нового уровня стека командами do, xecute или вызовом функции
системная переменная $etrap получает значение предыдущего уровня
стека. В случае если к ней была применена команда new, то, начиная с
этого уровня стека, системная переменная $etrap имеет указанное значение, и при покидании этого уровня стека значение утрачивается. После
обработки одного уровня стека система MiniM продолжает возвращаться
11.3. ГЕНЕРАЦИЯ ОШИБКИ
353
по стеку и на каждом уровне проверяет значение системной переменной
$etrap, чтобы выполнить обработку ошибок.
В случае если значение системной переменной $etrap не пустая строка, процесс MiniM исполняет код, указанный в ней, и его выполнение
производится на том же уровне стека без создания нового.
Для того, чтобы программист мог указать процессу место на стеке, на котором следует производить обработку ошибок, предоставляется
системная переменная $estack. При создании нового уровня стека она
увеличивает своё значение на единицу. При применении к ней команды
new значение $estack сбрасывается в нулевое значение, и при создании
новых уровней стека отсчёт ведётся сначала. При возврате на предыдущий уровень стека значение $estack получает то значение, которое
там было. Это поведение позволяет программисту опереться на значение
$estack при обработке ошибок с тем, чтобы вернуться по стеку в нужное
место. Наример:
n $es,$et="q:$es d err"
Здесь к системной переменной $estack применяется команда new, и
с этого уровня стека $estack начинает увеличиваться на единицу. Для
системной переменной $etrap создаётся новая копия значения, в которой
указано выполнять команду quit, если значение $estack не нулевое. Таким образом, при раскрутке стека система MiniM выполняет возвраты
по стеку, пока не найдет тот уровень, для которого $estack=0. И на этом
уровне стека выполнит команду d err.
Если при раскрутке стека система MiniM не обнаруживает не пустое
значение системной переменной $etrap, то продолжает переходить на всё
меньшие уровни, пока они не закончатся. В случае если процесс интерактивный, например запущена консоль или телнет-процесс, управление
будет передано в командную строку, и выведено значение системной переменной $zerror. В случае если процесс не интерактивный, то процесс
завершится.
11.3
Генерация ошибки
Для генерации ошибки программно у программиста есть три возможности: 1) присвоить не пустое значение системной переменной $ecode,
2) вызвать операцию, генерирующую ошибку, например обратиться к
неопределённой переменной и 3) использовать команду ztrap.
354
ГЛАВА 11. ОБРАБОТКА ОШИБОК
Если во втором случае будет сгенерирована ошибка, предусмотренная
стандартом, или одна из расширенных ошибок MiniM, то в первом и
третьем случае программист сам управляет содержанием ошибки.
При присваивании пустой строке системной переменной $ecode её
значение обнуляется, и никаких иных действий MiniM не производит.
При присваивании не пустой строке это значение запоминается в системной переменной $ecode как есть, и генерируется ошибка <ECODETRAP>.
При происхождении стандартной ошибки, одной из предусмотренных
системой MiniM, она придерживается соглашений стандарта - дописываются коды ошибок с разделителем запятая. Например:
USER>s $ec="w"
<ECODETRAP>
USER>s $ec=$ec_"w"
<ECODETRAP>
USER>w $ec
ww
USER>w e
<UNDEFINED> *e
USER>w $ec
ww,M6,
В кодах ошибок используется правило их формирования. Считается, что если код ошибки начинается с буквы M, то это ошибка, предусмотренная стандартом, если начинается с буквы Z, то это ошибка
из расширений имплементации (в данном случае одна из расширенных
ошибок MiniM), если код начинается с буквы U, то это пользовательская ошибка или ошибка, специально сгенерированная программистом
в своей программе. Это соглашение позволяет определённым образом
различать классы ошибок.
Программистам рекомендуется придерживаться в своей программе
некоторой схемы или правил составления значений системной переменной $ecode. Это может быть как следование стандартным соглашениям
(разделение кодов через запятую), так и игнорирование этого соглашения, и следование собственным соглашениям.
Глава 12
Регулярные выражения
12.1
Опции регулярных выражений
Функции $zpcrematch, $zpcresearch и $zpcrereplace построены на библиотеке pcre (http://www.pcre.org), автор Philip Hazel. Для функций
работы с регулярными выражениями в MiniM может быть полезна любая литература, справочники и библиотеки регулярных выражений. Программисты, работающие с другими языками, поддерживающие регулярные выражения, могут полностью применить свои знания и портировать
библиотеки шаблонов.
Документация на регулярные выражения составлена на основе документации с сайта http://www.pcre.ru и адаптирована под язык MUMPS
и реализацию его в MiniM.
Значение параметра options, передаваемое в функции $zpcremztch,
$zpcresearch и $zpcrereplace, рассматривается как набор символов нечувствительно к регистру. Наличие символа опции (или модификатора) задает её применение. Если значение options не указано, то функции считают что передана пустая строка. Символы опций применяются нечувствительно к регистру. В случае если указан символ, не соответствующий ни одной опции в перечисленном списке, то этот символ игнорируется.
355
356
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
A
I
D
S
Соответствует PCRE_ANCHORED. Если данный модификатор используется, соответствие шаблону будет достигаться только в том случае, если он соответствует началу строки, в которой производится
поиск. Для функции $zpcrematch наличие или отсутствие опции не играет роли, поскольку сопоставление производится всей строки.
Соответствует PCRE_CASELESS. Если этот модификатор используется, символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.
Соответствует PCRE_DOLLAR_ENDONLY. Если
данный модификатор используется, метасимвол $ в
шаблоне соответствует только окончанию обрабатываемых данных. Без этого модификатора метасимвол $ соответствует также позиции перед последним
символом, в случае, если им является перевод строки (но не распространяется на любые другие переводы строк). Данный модификатор игнорируется, если
используется модификатор m. В языке Perl аналогичный модификатор отсутствует.
Соответствует PCRE_DOTALL. Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем символам, включая перевод
строк. Без него - всем, за исключением переводов
строк. Этот модификатор эквивалентен записи /s в
Perl. Класс символов, построенный на отрицании, например [ˆa], всегда соответствует переводу строки,
независимо от наличия этого модификатора.
12.1. ОПЦИИ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
M
Соответствует PCRE_MULTILINE. По умолчанию
PCRE обрабатывает данные как однострочную символьную строку (даже если она содержит разделители строк). Метасимвол начала строки ’ˆ’ соответствует только началу обрабатываемого текста, в то время
как метасимвол "конец строки" ’$’ соответствует концу текста, либо позиции перед завершающим текст
переводом строки (в случае, если модификатор D не
установлен). В Perl ситуация полностью аналогична.
Если этот модификатор используется, метасимволы
"начало строки" и "конец строки" также соответствуют позициям перед произвольным символом перевода
и строки и, соответственно, после. Это соответствует
Perl-модификатору \m. В случае, если обрабатываемый текст не содержит символов перевода строки,
либо шаблон не содержит метасимволов ’ˆ’ или ’$’,
данный модификатор не имеет никакого эффекта.
U
Для функции $zpcrematch наличие или отсутствие
опции не играет роли, поскольку сопоставление производится всей строки.
Соответствует PCRE_UNGREEDY. Этот модификатор инвертирует жадность квантификаторов, таким
образом они по умолчанию не жадные. Но становятся жадными, если за ними следует символ ’?’. Такая возможность не совместима с Perl. Модификатор
U также может использоваться внутри шаблона, при
помощи ’?U’ записи.
357
358
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
X
T
G
B
E
P
Соответствует PCRE_EXTENDED. Если данный модификатор используется, неэкранированные пробелы, символы табуляции и пустой строки в шаблоне
игнорируются, если они не являются частью символьного класса. Также игнорируются все символы
между неэкранированным символом ’#’ (если он не
является частью символьного класса) и символом перевода строки (включая сами символы ’\n’ и ’#’).
Это эквивалентно Perl-модификатору \x, и позволяет размещать комментарий в сложных шаблонах. Замечание: это касается только символьных данных.
Пробельные символы не фигурируют в служебных
символьных последовательностях, к примеру, в последовательности ’(?(’, открывающей условную подмаску.
Соответствует PCRE_EXTRA. Этот модификатор
включает дополнительную функциональность PCRE,
которая не совместима с Perl: любой обратный слеш
в шаблоне, за которым следует символ, не имеющий
специального значения, приводят к ошибке. Это обусловлено тем, что подобные комбинации зарезервированы для дальнейшего развития. По умолчанию же,
как и в Perl, слеш со следующим за ним символом
без специального значения трактуется как опечатка.
На сегодняшний день это все возможности, которые
управляются данным модификатором
Произвести многократный поиск или замену, для
всех вхождений
Соответствует PCRE_NOTBOL. Запрещает использование символа-шаблона начала строки (ˆ) в регулярном выражении. Поиск по таким шаблонам всегда
дает отрицательный результат.
Соответствует PCRE_NOTEOL. Запрещает использование символа-шаблона конца строки ($) в регулярном выражении. Поиск по таким шаблонам всегда
дает отрицательный результат.
Строка для замены with в функции $zpcrereplace
рассматривается как строка с псевдопеременными.
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
12.2
359
Синтаксис регулярных выражений
Библиотека PCRE является набором функций, которые реализуют поиск
по шаблону, используя синтаксис, подобный синтаксису Perl 5 с небольшими отличиями.
Отличия от Perl
Разница описана относительно версии Perl 5.005.
1
2
3
4
К пробельным символам относятся символы, считающиеся пробельными в MiniM. Это пробел, горизонтальная табуляция, перевод строки, перевод каретки,
вертикальная табуляция, неразрывный пробел.
PCRE не позволяет использовать квантификаторы
повторения в условных выражениях. Perl позволяет
это делать, но получаемый результат может существенно отличаться от ожидаемого. Например, (?!a)3
не означает, что три следующих символа будут не ’a’.
Он всего лишь трижды утверждает, что следующий
символ не ’a’.
Во время сопоставления подмаски, находящейся
внутри отрицающего условного выражения, счетчик
подмасок увеличивается, но сами значения, зафиксированные такой подмаской, не возвращаются (в результирующем массиве по соответствующим смещениям находятся пустые строки). Perl устанавливает
значения соответствующих числовых переменных исходя из предшествующей модмаски, найденной непосредственно перед тем, как отрицающее условие не
смогло быть сопоставлено (и таким образом выполнилось), но только в том случае, если условное выражение содержит только одну ветвь.
Несмотря на то, что символ, соответствующий
ASCII-коду 0 (бинарный ноль), допускается в обрабатываемом тексте, он недопустим в шаблоне. Cледующая служебная последовательность: "\x00" может
быть использована для представления бинарного ноля.
360
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
5
6
7
8
9
Следующие служебные последовательности, используемые в Perl, не поддерживаются: \l, \u, \L, \U,
\E, \Q. Это связано с тем, что обработка указанных
последовательностей производится внутренним Perlмеханизмом обработки строк и не является частью
механизма регулярных выражений.
Perl модификатор \G не поддерживается, так как он
не входит в рамки простого сопоставления шаблону.
PCRE не поддерживает конструкции вида (?code).
В Perl 5.005_02 имеются особенности, связанные
с фиксацией результата в случае, когда часть
шаблона повторяется. Например, применяя шаблон
"ˆ(a(b)?)+$" к строке "aba", переменная $2 соответствует ’b’. Но при применении шаблона "ˆ(aa(bb)?)+$"
к строке "aabbaa" переменная $2 оказывается неустановленной. А в случае, если шаблон изменить на
"ˆ(aa(b(b))?)+$", переменные $2 и $3 окажутся установленными. В Perl 5.004, в обоих случаях переменная $2 будет содержать соответствующее значение,
что соответствует PCRE. Если в будущем Perl изменит поведение в данной ситуации, PCRE также
может измениться.
Шаблон "ˆ(a)?(?(1)a|b)+$" соответствует строке ’a’ в
PERL, но не в PCRE. В то же время шаблон "ˆ(a)?a"
соответствует строке ’a’ и в Perl и в PCRE, оставляя
переменную $1 неустановленной.
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
10
361
PCRE также предоставляет некоторое расширение
возможностей Perl для обработки регулярных выражений:
Несмотря на то, что условное выражение, ссылающееся на предыдущие вхождения, должно соответствовать строке фиксированной длины, каждая ветка
такого выражения в отдельности может соответствовать строке произвольной длины (отличающейся от
длины других веток). В то время как Perl 5.005 требует, чтобы все они имели одинаковую длину.
В
случае,
если
модификатор
"D"
(PCRE_DOLLAR_ENDONLY)
используется
и
"M" (PCRE_MULTILINE) не используется, специальный символ ’$’ соответствует исключительно
концу обрабатываемых данных.
В случае, если модификатор "T" (PCRE_EXTRA) используется, обратный слеш, за которым следует символ, не имеющий специального значения, приводит к
ошибке.
Модификатор "U" (PCRE_UNGREEDY) инвертирует
жадность квантификаторов, таким образом они по
умолчанию не жадные. Но становятся жадными, если за ними следует символ ’?’.
Ниже описан синтаксис Perl-совместимых регулярных выражений
(PCRE). Регулярные выражения также хорошо описаны в документации языка Perl и в достаточно большом количестве книг, с изобилием
примеров, например, книга "Mastering Regular Expressions", написанная
Effrey Friedl’s (ISBN 1-56592-257-3).
Регулярное выражение — это шаблон, применяемый к заданному тексту слева направо. Большая часть символов сохраняет свое значение в
шаблоне и означает совпадение с соответствующим символом. Банальный пример: шаблон The quick brown fox соответствует той части строки,
которая идентична приведенной фразе.
Метасимволы
Сила регулярных выражений исходит из возможности использовать
условия и повторения в шаблоне. Они записываются при помощи метасимволов, которые интерпретируются специальным образом.
362
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Существуют два различных набора метасимволов: те, которые используются внутри квадратных скобок, и те, которые используются вне
квадратных скобок. Рассмотрим их более детально. Вне квадратных скобок используются следующие метасимволы:
\
ˆ
$
.
[
]
|
(
)
?
∗
+
{
}
общий
экранирующий
символ,
допускающий
несколько вариантов применения
декларирует начало данных (или линии, в многострочном режиме)
декларирует конец данных (или линии, в многострочном режиме)
(точка) соответствует любому символу, кроме перевода строки (по умолчанию)
начало описания символьного класса
конец описания символьного класса
начало ветки условного выбора
начало подмаски
конец подмаски
расширяет смысл метасимвола ’(’ , квантификатор,
означающий ноль либо одно вхождение, квантификатор жадности
квантификатор, означающий ноль или более вхождений
квантификатор, означающий одно или более вхождений
начало количественного квантификатора
конец количественного квантификатора
Часть шаблона, заключенная в квадратные скобки, называется символьным классом. Внутри символьных классов используются следующие
метасимволы:
\
ˆ
]
общий экранирующий символ
означает отрицание класса, допустим только в начале класса
означает символьный интервал
завершает символьный класс
В нижеследующих секциях детально описан каждый из перечисленных метасимволов.
Обратный слеш
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
363
Символ ’\’ имеет несколько применений. Прежде всего, если он предшествует не буквенно-цифровому символу, он снимает с него специальное значение. Применение обратного слеша как экранирующего символа
допустимо как в символьном классе, так и вне него.
Например, если вы хотите задать соответствие символу ’*’, в шаблоне вам необходимо указать ’\*’. Это предотвратит трактование ’*’ как
метасимвола с особым значением. Во избежание ошибок всегда экранируйте не буквенно-цифровые символы, если хотите указать соответствие
самому символу. В частном случае для сопоставления с самим символом
обратного слеша, используйте запись ’\\’.
В случае, если указан модификатор "X" (PCRE_EXTENDED), пробельные символы в шаблоне (вне описания символьного класса) игнорируются. Также игнорируется часть строки, находящаяся между символом ’#’ (опять же, не участвующем в описании символьного класса) и
следующим символом перевода строки. В таком случае обратный слеш
можно применять как экранирующий символ для указания вхождений
пробельным символов в шаблоне.
Второе примение обратного слеша заключается в том, что он позволяет использовать непечатные символы в описании шаблона. При том, что
в PCRE нет ограничений на использование непечатных символов (исключая бинарный 0, который интерпретируется как конец шаблона), при
редактировании программного кода в каком-либо текстовом редакторе
гораздо удобнее использовать следующие комбинации:
\a
\cx
\e
\f
\n
\r
\t
\xhh
\ddd
символ оповещения, сигна, (шестнадцатиричный код
07)
"Ctrl+x", где x - произвольный символ
escape (шестнадцатеричный код 1B)
разрыв страницы (шестнадцатиричный код 0C)
перевод строки (шестнадцатиричный код 0A)
возврат каретки (шестнадцатиричный код 0D)
табуляция (шестнадцатиричный код 09)
символ с шестнадцатиричным кодом hh
символ с восьмеричным кодом либо ссылка на подмаску
Если быть более точным, комбинация \cx интерпретируется следующим образом: если ’x’ - символ нижнего регистра, он преобразуется в
верхний регистр. После этого шестой бит инвертируется.
364
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
После "\x" считываются еще две шестнадцатиричные цифры (они
могут быть записаны в нижнем регистре).
После "\0" считываются две восьмеричные цифры. Если в записи
менее двух цифр, будут использованы все фактически присутствующие
цифры. Таким образом, последовательность "\0\x\07" будет интерпретирована как два бинарных нуля, за которыми следует символ оповещения
(звонок). В случае, если вы используете представление числа в восьмеричном коде, убедитесь, что за начальным нулем следуют две значащие
цифры.
Обработка обратного слеша, за которым следует не нулевая цифра,
несколько сложнее. Вне символьного класса PCRE читает следующие за
обратным слешем цифры как десятичное число. Если полученное значение меньше десяти, либо если шаблон содержит по меньшей мере
такое же количество предшествующих текущей позиции подмасок, вся
конструкция интерпретируется как ссылка на подмаску. Более детальное описание будет приведено ниже при обсуждении механизма работы
подмасок.
Внутри символьного класса, либо если полученное значение больше
9 и соответствующее количество предшествующих подмасок отсутствует, PCRE считывает до трех восьмеричных цифр, следующих за обратным слешем, и генерирует один байт из последних 8-ми значащих битов
полученного значения. Все последующие цифры обозначают себя же.
Например:
\040
\40
еще один способ записи пробела
то же самое в случае, если данной записи предшествует менее сорока подмасок
\7
всегда интерпретируется как ссылка на подмаску
\11
может быть как обратной ссылкой, так и альтернативной записью символа табуляции
\011 всегда интерпретируется как символ табуляции
\0113 символ табуляции, за которым следует цифра "3"
\113
интерпретируется как символ с восьмеричным кодом
113 (так как ссылок на подмаски не может быть более
чем 99)
\377 байт, всецело состоящий из единичных битов
\81
либо обратная ссылка, либо бинарный ноль, за которым следуют цифры "8" и "1"
Следует помнить, что восьмеричные значения, превышающие 100,
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
365
следует писать без лидирующего нуля, так как читается не более трех
восьмеричных цифр.
Все последовательности, определяющие однобайтное значение, могут
встречаться как внутри, так и вне символьных классов. Кроме того, внутри символьного класса запись "\b" интерпретируется как символ возврата (’backspace’, шестнадцатеричный код 08). Вне символьного класса она
имеет другое значение (какое именно, описано ниже).
Третье использование обратного слеша - указание общего типа символов:
\d
\D
\s
\S
\w
\W
любая десятичная цифра
любой символ, кроме десятичной цифры
любой пробельный символ
любой непробельный символ
Любой символ, образующий "word"
Любой символ, не образующий "word"
Каждая пара таких специальных последовательностей делит полное
множество всех символов на два непересекающихся множества. Любой
символ соответствует одному и только одному множеству из пары.
"word" символ - это произвольная цифра, буква или символ подчеркивания, проще говоря, любой символ, который может являться частью
’слова’ в Perl.
Описанные выше типы символов могут применяться как внутри, так
и вне символьных классов, и соответствуют одному символу данного
типа.
Четвертое использование обратного слеша - нотация некоторых формальных утверждений, описывающих условия касательно месторасположения особых позиций в строке и совершенно не затрагивающих сами
символы. Такими управляющими последовательностями являются:
\b
\B
\A
\Z
\z
граница слова
не является границей слова
начало данных (независимо от многострочного режима)
конец данных либо позиция перед последним символом строки, в случае если это символ перевода
строки (независимо от многострочного режима)
конец данных (независимо от многострочного режима)
366
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Описанные выше последовательности не могут встречаться в символьных классах (исключая комбинацию ’\b’, которая внутри класса
означает символ возврата ’backspace’).
Границей слова считается такая позиция в строке, в которой из текущего и последующего символа только один соответствует \w (т.е. один
из них соответствует \w, а другой \W). Начало или конец строки также
соответствуют границе слова в случае, если первый или, соответственно,
последний символ совпадает с \w.
Специальные последовательности \A, \Z и \z отличаются от общеупотребляемых метасимволов начала строки ’ˆ’ и конца строки ’$’ тем,
что их поведение не зависит от наличия или отсутствия модификаторов. На них никак не влияют опции "M" (PCRE_MULTILINE) и "D"
(PCRE_DOLLAR_ENDONLY). Разница между \z и \Z в том, что \Z
соответствует позиции перед последним символом в случае, если последний символ - перевод строки. В то время, как \z соответствует исключительно концу данных.
Метасимволы начала и конца строки
По умолчанию, вне символьного класса метасимвол начала строки
’ˆ’ соответствует началу обрабатываемых данных (если не используются
модификаторы). Внутри символьного класса он имеет совершенно другое
значение.
Метасимвол ’ˆ’ не обязан быть первым символом строки в случае,
если в шаблоне используются несколько альтернатив, но должен быть
первым символом в каждой из альтернатив, в которой он встречается,
если шаблон когда-либо сопоставим с соответствующей веткой. Если
все альтернативы начинаются с метасимвола начала строки, то шаблон
ограничен для совпадения исключительно в начале строки, говорят что
шаблон "заякорен". (Существуют и другие способы "заякорить" шаблон).
Соответствие метасимволу конца строки достигается только в конце
строки или непосредственно перед последним символом в случае, если
им является перевод строки (если модификаторы не указаны). Метасимвол конца строки не обязан быть последним символом шаблона в
случае, если несколько альтернатив используется, но должен быть последним символом в каждой альтернативе, в которой он фигурирует.
Внутри символьного класса символ ’$’ не имеет специального значения.
Поведение метасимвола конца строки может быть изменено при помощи модификатора "D" (PCRE_DOLLAR_ENDONLY) так, чтобы он соответствовал исключительно концу строки. Данный флаг никак не касается специальной последовательности \Z.
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
367
Значение метасимволов начала и конца строки меняется в случае,
если модификатор "M" (PCRE_MULTILINE) используется. В таком случае, помимо совпадений в начале либо конце строки, метасимволы ’ˆ’
и ’$’ соответствуют позиции непосредственно после символа перевода
строки соответственно. Например, шаблон ˆabc$ встречается в строке
"def\nabc" в многострочном режиме и не встречается в нормальном режиме. Таким образом, шаблон который "заякорен" в однострочном режиме, не будет являться "заякоренным" в многострочном режиме. Модификатор "D" (PCRE_DOLLAR_ENDONLY) игнорируется в случае, если
модификатор "M" (PCRE_MULTILINE) установлен.
Следует заметить, что служебные последовательности \A, \Z и \z
могут использоваться для сопоставления с началом либо концом строки в обоих режимах. И если все ветви шаблона начинаются с \A,
шаблон будет заякорен независимо от присутствия модификатора "M"
(PCRE_MULTILINE).
Метасимвол точка
Вне символьного класса символ точка соответствует любому (в том
числе и непечатному, бинарному) символу, кроме символа перевода строки ’\n’. В случае, если модификатор "S" (PCRE_DOTALL) используется,
точка соответствует также символу перевода строки. Обработка метасимвола "точка", никак не связана с метасимволами начала и конца
строки, единственное, что у них общего,- так это специальное отношение к символу перевода строки. Внутри символьного класса точка не
имеет специального значения.
Квадратные скобки
Открывающая квадратная скобка объявляет начало символьного класса, завершаемого закрывающей квадратной скобкой. Символ ’]’ не имеет
специального значения, и в случае, если закрывающая квадратная скобка необходима как член символьного класса, она должна быть первым
символом непосредственно после открывающей квадратной скобки (если используется метасимвол ’ˆ’, то непосредственно после него), либо
экранироваться при помощи обратного слеша.
Символьный класс соответствует одиночному символу обрабатываемой строки, причем сам символ должен содержаться в наборе, определяемым классом. В случае, если первым символом описания класса
является ’ˆ’, логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом.
Если символ ’ˆ’ необходим как член класса, его не следует помещать
368
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
первым символом в описании класса либо необходимо экранировать при
помощи обратного слеша.
К примеру, символьный класс [aeiou] соответствует любой гласной
букве в нижнем регистре, в то время, как [ˆaeiou] соответствует любому
символу, не являющемуся гласной буквой нижнего регистра. Следует
понимать, что символ ’ˆ’ всего лишь удобный инструмент для описания
символов, не используемых в сопоставлении.
В случае, если производится регистронезависимое сопоставление, любая буква символьного класса соответствует как своему верхнему, так
и нижнему регистру. Таким образом символьный класс [aeiou] соответствует как ’A’, так и ’a’. Аналогично, класс [ˆaeiou] не соответствует ни
’A’, ни ’a’.
Внутри символьного класса символ перевода строки "\n" не имеет специального значения, независимо от наличия модификаторов "S"
(PCRE_DOTALL) и "M" (PCRE_MULTILINE). Символьные классы, построенные на отрицании, например [ˆa], соответствуют символу перевода
строки.
Символ минус ’-’ внутри класса используется для задания символьного диапазона. Например, [d-m] соответствует любому символу, находящемуся между ’d’ и ’m’, включая сами символы ’d’ и ’m’. В случае, если
’-’ необходим, как член класса, он должен находиться в такой позиции,
в которой он не может интерпретироваться как диапазон (как правило,
это первый и последний символ описания класса) либо экранироваться
при помощи обратного слеша.
Недопустимо использовать закрывающую квадратную скобку в качестве границы символьного диапазона. К примеру шаблон ’[W-]46]’ будет
интерпретирован как символьный класс, состоящий из двух символов
("W" и "-"), за которыми следует строка "46]", таким образом шаблон
будет соответствовать строкам "W46]" или "-46]". Чтобы все же использовать символ ’]’ в описании диапазона, его необходимо экранировать
при помощи обратного слеша, к примеру шаблон [W-\]46] будет интерпретирован как символьный класс, состоящий из символьного диапазона
вместе с двумя последующими символами ’4’ и ’6’. Такого же результата
можно достичь используя шестнадцатиричное или восьмеричное представление символа ’]’.
Для построения символьных диапазонов используется ASCII представление символов. Таким образом пограничные символы можно задавать непосредственно в числовом представлении, например, [\000-\037].
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
369
В случае, если выполняется регистронезависимый поиск, символы, описанные в диапазоне, также будут соответствовать символам обеих регистров. К примеру, диапазоны [W-c] и [][\ˆ_‘wxyzabc] эквивалентны (в
случае регистронезависимого поиска).
Общие типы символов \d, \D, \s, \S, \w, и \W также могут использоваться в символьных классах, добавляя при этом в класс те символы, которым соответствуют. Например, класс [\dABCDEF] соответствует любой шестнадцатиричной цифре. Символ ’ˆ’ может использоваться
совместно с общим типом, взятым в верхнем регисте, для указания более
узкого набора символов. Например, класс [ˆ\W_] соответствует любой
букве или цифре, но не символу подчеркивания.
Все неалфавитные символы, кроме \, -, ˆ (вначале) и завершающего
’]’, не являются специальными символами, но использование экранирующего слеша перед ними не навредит.
Вертикальная черта
Символ вертикальной черты ’|’ используются для разделения альтернативных масок. Например шаблон gilbert|sullivan соответствует как
"gilbert" так и "sullivan". Допустимо указывать любое количество альтернатив, также допустимо указывать пустые альтернативы (соответствуют
пустой строке). В процессе поиска соответствия просматриваются все
перечисленные альтернативы слева направо, останавливаясь после первого найденного соответствия. В случае, если альтернативные варианты
перечислены в подшаблоне, то поиск соответствия означает нахождение
соответствия одному из альтернативных вариантов подмаски и остатку
основного шаблона.
Установка внутренних опций
Установки "I" (PCRE_CASELESS), "M" (PCRE_MULTILINE), "S" (PCRE_DOTALL)
и "X" (PCRE_EXTENDED) могут быть локально предопределены в шаблоне с использованием специальных символьных Perl-последовательностей,
заключенных между символами "(?" и ")".
Символы внутренних опций:
i
m
s
x
для "I" (PCRE_CASELESS)
для "M" (PCRE_MULTILINE)
для "S" (PCRE_DOTALL)
для "X" (PCRE_EXTENDED)
Например, (?im) указывает на регистронезависимый, многострочный
370
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
режим поиска. Также можно сбросить опцию, поставив перед ней символ
’-’, либо комбинировать установку и отмену режимов. Например, (?im-sx)
устанавливает флаги "I" (PCRE_CASELESS), "M" (PCRE_MULTILINE)
и отменяет флаги "S" (PCRE_DOTALL) и "X" (PCRE_EXTENDED). В
случае, если опциональный символ расположен непосредственно после
либо перед символом ’-’, опция будет отменена.
Область видимости данных опций зависит от того, где именно в шаблоне они используются. В случае, если они указаны вне подмаски, эффект будет тот же, что и при указании их в самом начале шаблона.
Таким образом, нижеследующие паттерны эквивалентны:
(?i)abc
a(?i)bc
ab(?i)c
abc(?i)
что, в свою очередь равносильно компиляции шаблона ’abs’ с указанием модификатора "I" (PCRE_CASELESS). Другими словами, такие
установки верхнего уровня применяются ко всему шаблону (если отсутствуют дополнительные модификаторы в подмасках). Если присутствуют
несколько опций верхнего уровня, будет использована самая правая опция.
В случае, если опция встречается в подмаске, эффект может быть
разным. В Perl 5.005 была добавлена следующая особенность: опция
внутри подмаски влияет только на ту часть подмаски, которая идет
после указания опции. Таким образом (a(?i)b)c соответствует исключительно строкам ’abc’ и ’aBc’ (предполагается, что модификатор "I"
(PCRE_CASELESS) не используется). Это означает, что cуществует возможность указывать различные наборы опций для отдельных участков
шаблона. Применение опций в одной из альтернативных веток также
распространяется на все последующие ветки. Например: (a(?i)b|c) соответствует "ab", "aB", "c" и "C", хотя при совпадении с "C" первая ветвь
покидается до установки опции. Это объясняется тем, что установка всех
опций происходит на этапе компиляции шаблона.
Опции, специфичные для PCRE, такие как "U" (PCRE_UNGREEDY)
и "T" (PCRE_EXTRA) могут быть установлены точно так же, как и
Perl-совместимые опции, путем использования символов "U" и "X" соответственно. Флаг (?X) специфичен тем, что должен быть расположен в
шаблоне прежде, чем будет использоваться любая другая дополнительная возможность, даже если он расположен на верхнем уровне. Лучше
всего размещать флаг (?X) в самом начале шаблона.
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
371
Подмаски
Подмаски ограничиваются круглыми скобками, которые могут быть
вложенными. Использование части шаблона как подмаски имеет следующие функции:
1
2
Локализирует набор альтернатив. Например, шаблон
cat(aract|erpillar|) соответствует одному из слов "cat",
"cataract" или "caterpillar". Без использования скобок
он соответствовал бы строкам "cataract", "erpillar"
или пустой строке.
Указывает на необходимость захвата подстроки. В
том случае, если соответствие шаблону было найдено, подстроки, соответствующие подмаскам, также
передается обратно вызывающему при помощи аргумента ovector функции pcre_exec(). (Эта информация
приводится для пояснения для программистов, работавших с PCRE на C). Открывающие круглые скобки
нумеруются слева направо начиная с единицы и их
порядковые номера используются для нумерации соответствующих подстрок в результате.
Например, если строка "the red king" сопоставляется с шаблоном the
((red|white) (king|queen)), будут захвачены подстроки "red king", "red" и
"king", и их номера соответственно 1, 2 и 3.
На самом деле выполнение одновременно двух функций не всегда
удобно. Бывают случаи, когда необходима группировка альтернатив без
захвата строки. В случае, если после открывающей круглой скобки следует "?:", захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка "the white queen" сопоставляется с шаблоном
the ((?:red|white) (king|queen)), будут захвачены подстроки "white queen"
и "queen", и они будут пронумерованы 1 и 2 соответственно.
В случае, если в незахватывающей подмаске необходимо указать
дополнительные опции, можно воспользоваться удобным сокращением:
символ, обозначающий устанавливаемую опцию помещается между "?"
и ":". Таким образом, следующие два шаблона
(?i:saturday|sunday)
(?:(?i)saturday|sunday)
соответствуют одному и тому же набору строк. Поскольку альтернативные версии берутся слева направо, и установленные опции сохраняют
372
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
свое действие до конца подмаски, опция, установленная в одной ветке,
также имеет эффект во всех последующих ветках. Поэтому приведенные
выше шаблоны совпадают как с "SUNDAY", так и с "Saturday".
Повторение
Повторение задается при помощи квантификаторов, следующих за
любым из указанных ниже элементов:
• произвольным, возможно экранированным, символом;
• метасимволом "точка";
• символьным классом;
• ссылкой на предыдущий фрагмент шаблона (см. следующий раздел);
• взятой в круглый скобки подмаской (если это не утверждение - см.
далее).
Общий квантификатор повторения указывает минимальное и максимальное допустимое количество совпадений, согласно двум числам, заключенными в фигурные скобки и разделенными запятой. Числа должны
быть меньше чем 65536, и первое число не должно превышать второе по
значению. Например: z2,4 соответствует "zz", "zzz" или "zzzz". Закрывающая фигурная скобка сама по себе не является специальным символом.
В случае, если второе число опущено, но запятая присутствует, нет верхнего предела; в случае, если и второе число и запятая опущены, требуется точное число повторений. Таким образом [aeiou]3, соответствует как
минимум трем последовательным гласным (а также любому их количеству выше трех), в то время как \d8 соответствует исключительно восми
цифрами. Открывающая фигурная скобка, расположенная в недопустимой для квантификатора позиции, либо не соответствующая синтаксису
квантификатора, интерпретируется как обыкновенная символьная строка. Например, {,6} не является квантификатором, а интерпретируется
как символьная строка из четырех символов.
Квантификатор {0} является допустимым и ведет себя таким образом,
будто бы сам квантификатор и предшествующий ему элемент отсутствуют.
Для удобства (а так же обратной совместимости) три наиболее распространённых квантификатора имеют односимвольные аббревиатуры:
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
∗
+
?
373
эквивалентен {0,}
эквивалентен {1,}
эквивалентен {0,1}
Можно конструировать бесконечные циклы, указав после шаблона,
не содержащегося в заданной строке, квантификатор, не имеющий верхнего предела, например: (a?)*
Ранние версии Perl и PCRE выдавали ошибку во время компиляции
для таких шаблонов. Однако, поскольку бывают случаи, когда подобные шаблоны могли бы быть полезны, поддержка таких шаблонов была
добавлена. Но если любое повторение такой подмаски фактически не
совпадает ни с какими символами, цикл принудительно прерывается.
По умолчанию, все квантификаторы являются "жадными", это означает, что они совпадают максимально возможное количество раз (но не
более, чем максимально допустимое количество раз), не приводя к невозможности сопоставления остальных частей шаблона. Классический пример проблем, которые могут возникнуть в связи с такой особенностью
квантификаторов - нахождение комментариев в C-программах. Комментарием считается произвольный текст, находящийся внутри символьных
комбинаций /* и */ (при этом, символы ’/’ и ’*’ также могут быть частью комментария). Попытка найти комментарии при помощи шаблона
"\*.*\*" в строке /* первый комментарий */ не комментарий /* второй
комментарий */ закончится неудачей, поскольку указанный шаблон соответствует всей строке целиком (из-за жадности кватификатора ’*’).
Однако, если сразу же после квантификатора идет вопросительный
знак, он перестает быть жадным и соответствует минимально допустимому количеству раз. Таким образом, шаблон "\*.*?\*" корректно находит
все комментарии языка Си. Использование символа ’?’ после квантификатора влияет исключительно на его жадность, и не затрагивает никакие
другие свойства. Не следует путать использование символа ’?’ как, собственно, квантификатора (ноль либо одно соответствие) и как ограничителя жадности. Также в следствие его двойственной функциональности может использоваться следующая запись: \d??\d, которая в первую
очередь соответствует одной цифре, но также может соответствовать и
двум цифрам, если это необходимо для соответствия остальных частей
шаблона.
В случае, если установлена опция "U" (PCRE_UNGREEDY) (отсутствующая в Perl), квантификаторы являются не жадными по умолчанию,
374
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
но могут становиться жадными, если за ними следует символ ’?’. Говоря
другими словами, знак вопроса инвертирует жадность квантификаторов.
В случае, если используется подмаска с квантификатором, для которого задано минимальное количество повторений (больше одного), либо
если задано максимальное количество повторений, для откомпилированного шаблона требуется больше памяти (пропорционально миниму либо
максимуму соответственно).
В случае, если шаблон начинается с .* либо .0,, и установлен модификатор "S" (PCRE_DOTALL) (являющийся аналогом Perl-опции /s), который позволяет метасимволу "точка" соответствовать переводу строки,
шаблон неявно заякоривается. Это происходит поскольку все последующие конструкции будут сопоставляться с каждой символьной позицией
в обрабатываемом тексте, и, как следствие, начало строки - единственная позиция, дающая наиболее полное совпадение. PCRE рассматривает
каждый такой шаблон, как если бы ему предшествовала последовательность \A. В случае, если известно, что данные не содержат переводов
строк, а сам шаблон начинается на .*, рекоммендуется использовать "S"
(PCRE_DOTALL) для оптимизации шаблона, либо использовать метасимвол ’ˆ’ для указания явного заякоривания.
В случае, если захватывающая подмаска повторяется, результирующим значением подмаски будет подстрока, совпадающая с результатом
последней итерации. Например, после того, как (tweedle[dume]3\s*)+
совпадет с "tweedledum tweedledee", результирующим значением подмаски будет "tweedledee". Однако, если присутствуют вложенные захватывающие подмаски, соответствующие значения могут быть установлены в
предыдущих итерациях. Например, после того, как "(a|(b))+" совпадет с
"aba", значением второй захваченной подстроки будет "b".
Обратные ссылки
Вне символьного класса обратный слеш с последующей цифрой больше нуля (и, возможно, последующими цифрами) интерпретируется как
ссылка на предшествующую захватывающую подмаску, предполагая, что
соответствующее количество предшествующих открывающих круглых
скобок присутствует.
Однако, в случае, если следующее за обратным слешем число меньше 10, оно всегда интерпретируется как обратная ссылка, и приводит
к ошибке только в том случае, если нет соответствующего числа открывающих скобок. Другими словами, открывающие скобки не обязаны
предшествовать ссылке для чисел меньше 10. Более детальную инфор-
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
375
мацию об обработке слеша, за которым следуют цифры, можно найти в
разделе "Обратный слеш".
Обратная ссылка сопоставляется с частью строки, захваченной соответствующей подмаской, но не с самой подмаской. Таким образом
шаблон (sens|respons)e and \1ibility соответствует "sense and sensibility",
"response and responsibility", но не "sense and responsibility". В случае,
если обратная ссылка обнаружена во время регистрозависимого поиска, то при сопоставлении обратной ссылки регистр также учитывается.
Например, ((?i)rah)\s+\1 соответствует "rah rah" и "RAH RAH", но не
"RAH rah", хотя сама подмаска сопоставляется без учета регистра.
На одну и ту же подмаску может быть несколько ссылок. Если подмаска не участвовала в сопоставлении, то сопоставление со ссылкой на
нее всегда терпит неудачу. Например, шаблон (a|(bc))\2 терпит неудачу,
если находит соответствие с "a" раньше, чем с "bc". Поскольку может
быть до 99 обратных ссылок, все цифры, следующие за обратным слешем, рассматриваются как часть потенциальной обратной ссылки. Если
за ссылкой должна следовать цифра, необходимо использовать ограничитель. В случае, если указан модификатор "X" (PCRE_EXTENDED),
ограничителем может быть любой пробельный символ. В противном случае можно использовать пустой комментарий.
Ссылка на подмаску, внутри которой она расположена, всегда терпит неудачу, если это первое сопоставление текущей подмаски. Например, шаблон (a\1) не соответствует ни одной строке. Но все же такие
ссылки бывают полезны в повторяющихся подмасках. Например, шаблон (a|b\1)+ совпадает с любым количеством "a", "aba", "ababaa"... При
каждой итерации подмаски обратная ссылка соответствует той части
строки, которая была захвачена при предыдущей итерации. Чтобы такая конструкция работала, шаблон должен быть построен так, чтобы
при первой итерации сопоставление с обратной ссылкой не производилось. Этого можно достичь, используя альтернативы (как в предыдущем
примере) либо квантификаторы с минимумом, равным нулю.
Утверждения
Утверждения - это проверки касательно символов, идущих до или
после текущей позиции сопоставления, ничего при этом не поглощая
(никакие символы исходного текста не ставятся в соответствие утверждениям). Наиболее простые варианты утверждений, такие как \b, \B,
\A, \Z, \z, ˆ и $ были рассмотрены ранее. Более сложные утверждения
записываются как подмаски. Утверждения бывают двух видов: те, которые анализируют текст, предшествующий текущей позиции, и идущий
376
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
после нее.
Сопоставление подмаски, содержащий утверждение, происходит обычным образом, за исключением того, что текущая позиция не изменяется. Утверждения касательно последующего текста начинаются с (?= для
положительных утверждений и с (?! для отрицающих утверждений. Например, \w+(?=;) совпадает со словом, за которым следует символ ’;’, но
при этом сама точка с запятой в совпадение не включается. А foo(?!bar)
соответствует любому появлению "foo", после которого не идёт "bar". Заметим, что похожий шаблон (?!foo)bar не будет искать вхождение "bar",
которому предшествует любая строка за исключением "foo". Но, тем не
менее, он будет соответствовать любым вхождениям подстроки "bar",
поскольку условие (?!foo) всегда TRUE, если следующие три символа "bar". Для получения желаемого результата необходимо воспользоваться
второй категорией утверждений.
Утверждения касательно предшествующего текста начинаются с (?<=
для положительных утверждений и (?<! для отрицающих. Например,
(?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".
Сами утверждения ’назад’ ограничены так, чтобы все подстроки, которым они соответствуют, имели фиксированную длину. Но, в случае,
если используются несколько альтернатив, они не обязаны иметь одинаковую длину. Таким образом шаблон (?<=bullock|donkey) корректен,
но (?<!dogs?|cats?) вызовет ошибку во время компиляции. Ветки, которые соответствуют строкам разной длины, разрешены только на верхнем
уровне утверждений касательно предшествующего текста. Это расширение относительно Perl 5.005, который требует чтобы все ветки соответствовали строкам одинаковой длины. Такое утверждение как (?<=ab(c|de))
не корректно, поскольку верхний уровень маски может соответствовать
строкам разной длины, но его можно преобразовать к корректному шаблону, используя альтернативы на верхнем уровне: (?<=abc|abde). Утверждения касательно предшествующего текста реализованы так, что для
каждой альтернативы текущая позиция временно переносится назад,
на фиксированную ширину, после чего выполняется поиск соответствия
условию. В случае, если перед текущей позицией недостаточно символов, поиск соответствия терпит неудачу. Утверждения назад в сочетании
с однократными подмасками могут быть особенно удобны для поиска в
конце строки; соответствующий пример приведен в конце раздела "Однократные подмаски".
Несколько утверждений (разных типов) могут присутствовать в утверждении, например: (?<=\d3)(?<!999)foo совпадает с подстрокой "foo", которой предшествуют три цифры, отличные от "999". Следует понимать,
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
377
что каждое из утвержений проверяется относительно одной и той же
позиции в обрабатываемом тексте. Вначале выполняется проверка того,
что предшествующие три символа - это цифры, затем проверяется, чтобы
эти же цифры не являлись числом 999. Приведенный выше шаблон не
соответствует подстроке "foo", которой предшествуют шесть символов,
первые три из которых - цифры, а последние три не образуют "999".
Например, он не соответствует строке "123abcfoo", в то время как шаблон (?<=\d3...)(?<!999)foo - соответствует. В этом случае анализируются
предшествующие шесть символов на предмет того, чтобы первые три из
них были цифрами, а последние три не образовали "999".
Утверждения могут быть вложенными, причем в произвольных сочетаниях: (?<=(?<!foo)bar)baz соответствует подстроке "baz", которой предшествует "bar", перед которой, в свою очередь, нет "foo", а (?<=\d3(?!999)...)foo
- совершенно другой шаблон, соответствующий подстроке "foo", которой
предшествуют три цифры и три произвольных символа, отличных от
"999".
Утверждающие подмаски являются незахватывающими и неповторяемыми, поскольку бессмысленно повторять одно и то же несколько раз.
Если в утверждении произвольного типа находится захватывающая подмаска, она нумеруется в той же последовательности, что и все остальные
захватывающие подмаски, но захват соответствующих значений происходит только для положительных утверждений, поскольку для отрицающих это не имеет смысла.
Однократные подмаски
Как для минимального, так и максимального количества повторений,
если последующая часть шаблона терпит неудачу при сопоставлении,
происходит повторный анализ повторяемого выражения на предмет того,
возможно ли успешное сопоставление всего шаблона при другом количестве повторений. Бывают случаи, когда необходимо изменить описанную логику работы для реализации специфического сопоставления либо
оптимизации шаблона (если автор уверен, что других вариантов соответствия нет).
В качестве примера, рассмотрим шаблон \d+foo в применении к строке 123456bar
После того, как \d+ будет сопоставлен с первыми шестью цифрами,
сопоставление "foo" потерпит неудачу. После этого, в соответствие \d+,
будет сопоставлено 5 цифр, после очередной неудачи будет сопоставлено
4 цифры и так далее. В конце концов весь шаблон потерпит неудачу.
378
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Однократные подмаски указывают, что если одна часть шаблона была
сопоставлена, ее не стоит анализировать повторно. Применимо к приведенному выше примеру весь шаблон потерпел бы неудачу после первого
же неудачного сопоставления с "foo". Записываются однократные шаблоны при помощи круглых скобок следующим образом: (?>. Например:
(?>\d+)bar
Этот вид подмаски предотвращает повторный ее анализ в случае,
если сопоставление последующих элементов терпят неудачу. Однако, это
не мешает повторно анализировать любые другие элементы, в том числе
предшествующие однократной подмаске.
Говоря другими словами, подмаски такого типа соответствуют той
части подстроки, которой соответствовала бы одиночная изолированная
маска, заякоренная на текущей позиции обрабатываемого текста.
Однократные подмаски являются незахватывающими. Простые примеры, подобные приведенному выше, можно охарактеризовать как безусловный захват максимального количества повторений. В то время как
\d+ и \d+? корректируются так, чтобы остальные части шаблона так же
совпали, (?>\d+) соответствует исключительно максимальной по длине
последовательности цифр, даже если это приводит к неудаче при сопоставлении других частей шаблона.
Однократные подмаски могут включать в себя более сложные конструкции, а также могут быть вложенными.
Однократные подмаски могут использоваться совместно с утверждениями касательно предшествующего текста для описания эффективных
сопоставлений в конце обрабатываемого текста. Рассмотрим простой
шаблон abcd$ в применении к длинному тексту, который не соответствует указанной маске. Поскольку поиск происходит слева направо, вначале
PCRE будет искать букву "a", и только потом анализировать следующие
записи в шаблоне. В случае, если шаблон указан в виде ˆ.*abcd$. В таком случае вначале .* сопоставляется со всей строкой, после чего сопоставление терпит неудачу (так как нет последующего символа ’a’). После
чего .* сопоставляется со всей строкой, кроме последнего символа, потом
кроме двух последних символов, и так далее. В конечном итоге поиск
символа ’a’ происходит по всей строке. Однако, если шаблон записать в
виде: ˆ(?>.*)(?<=abcd) повторный анализ для .* не выполняется, и, как
следствие, может соответствовать только всей строке целиком. После
чего утверждение проверяет последние четыре символа на совпадение с
’abcd’, и в случае неудачи все сопоставление терпит неудачу. Для больших объемов обрабатываемого текста этот подход имеет значительный
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
379
выигрыш во времени выполнения.
Если шаблон содержит неограниченное повторение внутри подмаски, которая в свою очередь также может повторяться неограниченное
количество раз, использование однократных подмасок позволяет избегать многократных неудачных сопоставлений, которые длятся достаточно продолжительное время. Шаблон (\D+|<\d+>)*[!?] соответствует неограниченному количеству подстрок, которые состоят не из цифр, либо из
цифр заключенных в <>, за которыми следует ? либо !. В случае, если
в обрабатываемом тексте содержатся соответствия, время работы регулярного выражения будет невелико. Но если его применить к строке
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa это займет длительное время. Это связанно с тем, что строка может быть разделена
между двумя частями шаблона многими способами, и все они будут
опробованы (в примере мы использовали [?!], поскольку в случае одиночного символа в конце шаблона и PCRE и Perl выполняют оптимизацию.
Они запоминают последний одиночный символ и в случае его отсутствия выдают неудачу). Если изменить шаблон на ((?>\D+)|<\d+>)*[!?],
нецифровые последовательности не могут быть разорваны, и невозможность сопоставления обнаруживается гораздо быстрее.
Условные подмаски
В PCRE реализована возможность подчинять шаблон условию либо
выбирать из двух условных подмасок в зависимости от успеха сопоставления предыдущей подмаски. Условные подмаски имеют две допустимые
формы использования:
(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)
В случае успешного сопоставления условия condition, используется
подмаска yes-pattern, в противном случае no-pattern (если он присутствует). Если указано более двух альтернатив, возникнет ошибка во
время компиляции.
Условия бывают двух видов. В случае, если между скобками заключены цифры, условие будет выполняться в том случае, если подмаска с
соответствующим номером была успешно сопоставлена. Рассмотрим следующий шаблон (он содержит незначащий пробел для удобства чтения,
подразумевается использование модификатора "X" (PCRE_EXTENDED)),
разделив его для удобства на три смысловые части: ( \( )? [ˆ()]+ (?(1) \)
)
Первая часть соответствует опциональной открывающей скобке, и
в случае если она присутствует, захватывает ее как значение первой
380
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
подмаски. Следующая часть соответствует одному или более символам,
отличным от круглой скобки. Третья часть является условной подмаской, зависящей от результата сопоставления первой подмаски. В случае,
если в начале обрабатываемых данных была обнаружена открывающая
круглая скобка, условие будет интерпретировано как истина, и, следовательно, для успешного сопоставления третьей части шаблона необходима
закрывающая круглая скобка. В противном случае, поскольку не указана вторая ветвь условного шаблона, третья часть будет сопоставлена
с пустой строкой. Суммируя все вышесказанное, приведенный шаблон
совпадает с последовательностью не-скобок, возможно, заключенной в
круглые скобки.
В случае, если условие не является последовательностью цифр, оно
обязано быть условием. Это также может быть утверждающее или отрицающее условие касательно предшествующего либо последующего текста. Рассмотрим еще один шаблон, также содержащий незначащий пробел и два условия, записанные в следующей строке:
(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
Приведен пример с утверждающим условием касательно предшествующего текста, которое выполняется для необязательной последовательности не-букв с последующей буквой. Говоря другими словами, указанное условие проверяет наличие хотя бы одной предшествующей буквы. В
случае, если буква найдена, выполняется сопоставление с первой альтернативой, в противном случае - со второй альтернативой. Приведенный
шаблон соответствует строкам двух видов: dd-aaa-dd либо dd-dd-dd, где
aaaa - это буквы, а dd - цифры.
Комментарии
Служебная последовательность (?# обозначает начало комментария,
который продолжается до ближайшей закрывающей скобки. Вложенные
скобки не допускаются. Символы, находящиеся внутри комментария, не
принимают участия в сопоставлении шаблона.
В случае, если используется модификатор "X" (PCRE_EXTENDED),
неэкранированный символ ’#’ вне символьного класса также означает
начало блока комментария, который длится до конца текущей строки.
Рекурсивные шаблоны
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
381
Рассмотрим задачу поиска соответствия со строкой, находящихся
внутри неограниченного количества круглых скобок. Без использования рекурсии лучшее, что можно сделать - написать шаблон, который
будет решать задачу для некоторой ограниченной глубины вложенности, так как обработать неограниченную глубину не предоставляется
возможным. В Perl 5.6 предоставлены некоторые экспериментальные
возможности, которые в том числе позвояляют реализовать рекурсию
в шаблонах. Специально обозначение (?R) используется для указания
рекурсивной подмаски. Таким образом, приведем PCRE шаблон, решающий поставленную задачу (подразумевается, что используется модификатор "X" (PCRE_EXTENDED), незначащие пробелы игнорируются): \(
( (?>[ˆ()]+) | (?R) )* \)
Вначале он соответствует открывающей круглой скобке. Далее он
соответствует любому количеству подстрок, каждая из которых может
быть последовательностью не-скобок, либо строкой, рекурсивно соответствующей шаблону (т.е. строкой, корректно заключенной в круглые
скобки). И, в конце, идет закрывающая круглая скобка.
Приведенный пример шаблона использует вложенные неограниченные повторения, поэтому использование однократных шаблонов значительно ускоряет процесс сопоставления, особенно в случаях, когда строка не соответствует заданной маске. Например, если его применить
к строке: (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(), то
несоответствие будет обнаружено достаточно быстро. Но в случае, если однократные шаблоны не используются, сопоставление будет затягиваться на длительное время, так как существует множество способов
разделения строки между квантификаторами + и *, и все они должны
быть проверены, прежде чем будет выдано сообщение о неудаче.
Значение, устанавливаемое для захватывающей подмаски будет соответствовать значению, захваченному на наиболее глубоком уровне рекурсии. В случае, если приведенный выше шаблон сопоставляется со
строкой (ab(cd)ef), захваченным значением будет ’ef’, которое является
последним значением, принимаемым на верхнем уровне. В случае, если
добавить дополнительные скобки \( ( ( (?>[ˆ()]+) | (?R) )* ) \), захваченным значением будет "ab(cd)ef". В случае, если в шаблоне встречается
более, чем 15 захватывающих скобок, PCRE требуется больше памяти
для обработки рекурсии, чем обычно. Если память не может быть выделена, сохраняются данные только для первых 15 захватывающих скобок,
так как нет способа выдать ошибку out-of-memory изнутри рекурсии.
Производительность
382
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Некотрые элементы, которые могут встречаться в шаблонах, являются более эффективными, чем ряд других. Например, гораздо эффективней использовать символьный класс [aeiou] вместо набора альтернатив
(a|e|i|o|u). Как правило, более простая конструкция является более эффективной. Книга Jeffrey Friedl’а содержит много обсуждений вопроса
оптимизации регулярных выражений.
В случае, если шаблон начинается с .* и используется флаг "S"
(PCRE_DOTALL), шаблон неявно заякоривается, так как он может совпадать только в начале строки. Но если "S" (PCRE_DOTALL) не используется, PCRE не может выполнить соответствующую оптимизацию,
так как в таком случае метасимвол ’.’ не соответствует символу начала
строки (если обрабатываемые данные содержат переводы строк, такой
шаблон может соответствовать шаблону не от начала строки, а от позиции непосредственно после перевода строки). Например, применяя шаблон (.*) second к строке "first\nand second" (где \n обозначает символ
перевода строки), значение, захваченное первой подмаской, будет ’and’.
Чтобы обработать все возможные точки соответствия, PCRE пытается
сопоставить шаблон после каждого символа перевода строки.
В случае, если вы используете подобные шаблоны для обработки данных, не содержащих переводы строк, для лучшей производительности
используйте модификатор "S" (PCRE_DOTALL), либо начинайте шаблон с ˆ.* для указания явного заякоривания. Это предотвратит PСRE от
поиска символов новых строк и дополнительных попыток сопоставить
шаблон с каждой такой найденной позицией.
Избегайте шаблонов, которые содержат вложенные неограниченные
повторения. Сопоставление их со строками, не содержащими совпадений, занимает длительное время. Рассмотрим пример шаблона (a+)*
Он может соответствовать с "aaaa" 33-мя различными способами, и
эта цифра очень быстро растет при увеличении строки. (В данном примере, квантификатор * может совпадать 0, 1, 2, 3 или 4 раза, и для каждого такого случая, кроме нуля, квантификатор + также может совпадать
различное число раз.) Если остаток шаблона таков, что все совпадение
терпит неуачу, PCRE должно попробовать все возможные варианты совпадения, что может потребовать огромного количества времени.
При помощи оптимизации можно отловить наиболее простые случаи,
такие как (a+)*b где следом идёт литеральный символ. Прежде, чем
производить стандартную процедуру поиска, PCRE проверяет в последующей подстроке наличие символа ’b’, и, в случае отсутствия такового,
12.2. СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
383
попытка сопоставления немедленно завершается неудачей. Однако, когда последующего литерала нет, оптимизация не может быть применена.
Вы можете ощутить разницу, сравнив поведение (a+)*\d с поведением
приведенного выше шаблона. Первый определяет невозможность сопоставления практически сразу же, при сопоставлении со строкой состоящей из символов ’a’, в то время как второй тратит длительное время на
поиск в строках длинее 20 символов.
384
ГЛАВА 12. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Глава 13
Перечень ошибок
13.1
Список ошибок комитета MDC
Ошибки с кодами MDC (MUMPS Development Committee) при возникновении ситуаций, которые они описывают, записываются в системную
переменную $ecode через запятую с предшествующей буквой M, что
означает ошибку, описанную в стандарте языка.
MiniM возвращает текстовые описания ошибок функцией
$v("err",2,errcode)
В качестве errcode следует передать код ошибки. Например:
TEMP>s $ec=""
TEMP>w a
<UNDEFINED>
TEMP>s errcode=$p($ec,",",$l($ec,",")-1)
TEMP>s $e(errcode)=""
TEMP>w $v("err",2,errcode)
Undefined local variable.
Список ошибок, определённых комитетом MDC:
1. Naked indicator undefined.
2. Invalid $FNumber code string combination.
3. $Random argument less than 1.
385
386
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
4. No true condition in $Select.
5. Line reference less than 0 (zero).
6. Undefined local variable.
7. Undefined global variable.
8. Undefined special variable.
9. Divide by zero.
10. Invalid pattern match range.
11. No parameters passed.
12. Invalid line reference (negative offset).
13. Invalid line reference (line not found).
14. Line level not one (1).
15. Undefined index variable.
16. Quit with an argument not allowed.
17. Quit with an argument required.
18. Fixed-length Read not greater than 0 (zero).
19. Cannot merge a tree or subtree into itself.
20. Line must have a formal list.
21. Formal list name duplication.
22. Set or Kill to ˆ$Global structured system variable name (SSVN)
when data in global.
23. Set or Kill to ˆ$Job structured system variable name (SSVN) for
non-existent job number.
24. Change to collation algorithm while subscripted local variables defined.
26. Non-existent environment (non-existent namespace).
27. Attempt to roll back a transaction that is not re-startable.
28. Mathematical function, parameter out of range.
29. Set or Kill on structured system variable name (SSVN) not allowed
by implementation.
30. Reference to global variable with different collating sequence within
a collating algorithm.
31. Device control mnemonic expression used for a device without a
mnemonic space being selected.
32. Device control mnemonic used in user-defined mnemonic space
which has no associated line.
33. Set or Kill to ˆ$Routine when the routine specified exists.
35. Device does not support mnemonic spaces.
36. Incompatible mnemonic spaces.
37. Read from device identified by null string.
38. Invalid structured system variable name (SSVN) subscript.
39. Invalid $Name argument.
40. Call by reference in the actual parameter list in Job command.
13.2. СПИСОК ОШИБОК MINIM
387
41. Invalid Lock argument within a transaction.
42. Invalid Quit within a transaction.
43. Invalid range value ($X,$Y).
44. Invalid command outside a transaction.
45. Invalid Goto reference.
57. A label is defined more than once in a routine.
58. Too few formal parameters.
13.2
Список ошибок MiniM
Ошибки MiniM при их возникновении записыватся в угловых скобках
в системную переменную $zerror. При работе в интерактивном режиме
произошедшая ошибка также выводится на экран. Например:
TEMP>w a
<UNDEFINED>
TEMP>w $ze
<UNDEFINED>
Список ошибок, поддерживаемых системой MiniM:
BYTECODE
Разрушение байт-кода исполняемой рутины.
Разрушение байт-кода исполняемой строки команд.
Несоответствие версий исполняемого байт-кода и виртуальной машины.
COMMAND
Команда получила недопустимые значения аргумента, например write
*expr, где expr - отрицательное недопустимое число.
Команда quit с аргументом выполнилась в контексте без ожидания
возврата ($quit=0).
Команда quit с аргументом не может прервать цикл for.
Команда quit с аргументом не может прервать выполнение xecute.
Команда kill не может выполнить удаление из указанной структурной
системной переменной.
В аргументе команды lock недопустимое имя переменной.
Команда tcommit не может быть выполнена вне контекста транзакции
($tlevel=0).
Команда merge не может выполнить слияние переменной в неё же.
388
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
Команда merge может оперировать только локальными и глобальными переменными, переданное имя не подходит.
Команда zwrite неприменима к указанной переменной, должна быть
или локальная или глобальная переменные.
Команда job для запуска процесса с конкурентным сокетом получила
имя не TCP устройства.
DATABASE
Обращение к несуществующей базе данных.
База данных, к которой было обращение, существует, но не смонтирована.
Процесс не смог создать в базе данных точку роста глобала.
Файл базы данных или каталог базы данных не существует.
Файл базы данных не мог быть открыт на чтение.
Размер базы данных имеет недопустимые размеры, возможен сбой
файловой системы.
Была ошибка низкоуровневой записи в базу данных.
Не выполнилась низкоуровневая блокировка или разблокировка файла.
Разрушение памяти кэша базы данных.
Отсутствует системная база данных %SYS.
Отсутствует временная база данных TEMP.
Нарушение структуры файла базы данных.
Произошла ошибка сброса кэша.
Произошла ошибка расширения файла базы данных.
Произошла ошибка записи журнала.
Разрушены объекты синхронизации доступа к общей памяти сервера.
DBEXTEND
При попытке выполнить расширение базы данных расширение выполнить не удалось.
DBLIMIT
Была необходимость расширения базы данных для выполнения операции, но на размер базы установлено ограничение роста и операция не
может быть выполнена.
DBREADONLY
Была попытка записи в базу данных, которая подключена только на
чтение.
DEVICE
13.2. СПИСОК ОШИБОК MINIM
389
Не поддерживаются операции с устройством, идентифицированном
пустой строкой.
Операции с устройством этого типа не поддерживаются, неизвестный
тип устройства.
Ошибка физического обмена данными с устройством.
К устройству применяется не поддерживаемая им операция.
Разрушена память описания устройства.
DEVICELIMIT
Нет места в таблице устройств для заведения открытия еще одного
устройства.
DEVPARAM
Значение параметра устройства имеет недопустимую величину.
Отсутствует значение параметра устройства, хотя оно обязательно.
DIVIDE
Для выполнения операции понадобилось деление на ноль, операция
недопустима.
EDITED
При выполнении рутины было обнаружено, что байт-код используемой рутины был изменён.
ECODETRAP
Ошибка генерирована присваиванием переменной $ecode не пустого
значения.
ENDOFFILE
При чтении их устройств типа FILE, TCP или PIPE достигнут конец
входных данных.
FUNCTION
Функция получила недопустимое значение одного или более аргументов.
ILLEGAL VALUE
При выполнении математической операции получено значение, не
имеющее представления в разрядной сетке процессора.
Системные переменные $X или $Y получили недопустимые значения.
Формат даты или времени имеет недопустимое значение, ожидается
формат системной переменной $horolog.
390
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
Функция $zdateh получила недопустимое значение аргумента, представляющего дату, например 30-е февраля.
Функция $ztimeh получила недопустимое значение аргумента, представляющего время, например 28 часов.
Значение даты для функции $zdate находится вне допустимого диапазона дат.
INTERRUPT
При выполнении процесса в режиме консоли пользователь нажал
клавишную комбинацию Ctrl+Break или Ctrl+C.
INVALID BIT STRING
При выполнении битовых функций $bitXXX было обнаружено что в
качестве аргумента битовой строки передано значение не являющееся по
формату допустимой битовой строкой.
JOB
Запускаемый командой job процесс не смог запуститься.
Удаление командой kill собственного процесса из структурной системной переменной ˆ$JOB недопустимо.
Обращение к несуществующему значению структурной системной переменной ˆ$JOB.
В окружении локальных переменных команде job переданы не только
имена локальных переменных.
При запуске процесса командой job был физический сбой передачи
параметров дочернему процессу.
Командой job нельзя передавать локальные переменные по ссылке.
Команде job передана рутина с недопустимым именем.
Команда job не может выполниться из-за исчерпания таблицы процессов. Величина указывается в файле настроек minim.ini, секция Server,
ключ ProcessLimit.
Разрушение структур списка процессов сервера, команда job не может
выполниться.
LABELREDEF
При компиляции рутины в байт-код выявлено дублирование меток.
Метки с одинаковыми именами в одной рутине не допустимы.
LIBRARY LOAD
При обращении к ZDLL модулю не был найден модуль, или указанный модуль не является динамически подключаемой библиотекой, или
13.2. СПИСОК ОШИБОК MINIM
391
в процессе инициализации модуля произошла ошибка, или модуль не
экспортирует функцию ZDLL.
LIST
При использовании функций $listXXX было обнаружено, что структура строки не соответствует корректному формату списка.
MAXNUMBER
Переполнение разрядной сетки процессора или сопроцессора при операции с плавающей точкой слишком большое число, не может иметь
представления.
MAXOBJCODE
Превышен максимальный предел объектного кода для рутины (32
килобайт).
MAXSTRING
Операция не может быть выполнена, поскольку получается слишком
большая строка, предел 32 килобайт.
MEMORY
Операционная система не предоставила требуемый объём оперативной памяти.
MINNUMBER
Переполнение разрядной сетки процессора или сопроцессора при операции с плавающей точкой слишком маленькое число, не может иметь
представления.
MNEMSPACE
Недопустимое имя рутины для обработки мнемоник.
NAKED
Использование голой ссылки (naked indicator), если значение последней ссылки - пустая строка.
Использование голой ссылки (naked indicator), если значение последней ссылки не имеет ни одного индекса.
NAME
Синтаксически недопустимое имя локальной, глобальной или структурной системной переменной.
NAMESPACE
392
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
Обращение к несуществующей базе данных при использовании расширенного синтаксиса для рутин, структурных системных переменных
и глобальных переменных.
NOLINE
Использование несуществующей метки для исполнения подпрограммы или для перехода недопустимо.
NOROUTINE
Обращение к несуществующей рутине для исполнения её подпрограмм недопустимо.
NOTOPEN
Указанное устройство ввода-вывода не открыто, выполнение текущей
операции недопустимо.
NOZROUTINE
При обращении к пользовательской z-переменной или к пользовательской z-функции процесс не смог найти рутину, в которой лежит ее
реализация.
NULL VALUE
При возвращении значения элемента списка было обнаружено, что
этот элемент не существует или существует, но не имеет значения.
PARAMETER
У вызываемой подпрограммы есть параметры, но вызов сделан без
указания круглых скобок.
У метки нет параметров, но вызов сделан с параметрами.
Вызываемой подпрограмме передано больше параметров, чем она принимает.
PARAMLIMIT
Синтаксическая ошибка, при вызове подпрограммы передаётся недопустимо большое количество параметров, максимум - 63.
PATTERNLIMIT
Превышена сложность шаблона сопоставления, требуется слишком
много памяти для выполнения операции.
PCRE
13.2. СПИСОК ОШИБОК MINIM
393
Функциям использующим регулярные выражения передан синтаксически некорректный шаблон регулярного выражения, операция не может
быть выполнена.
RANGE
Функция обработки списка $listXXX обнаружила, что диапазон поиска задан некорректно.
Функция работы с битовыми строками $bit обнаружила, что позиция
бита задана некорректно, позиция должна быть в пределах от 1 до 262104
включительно.
Функция конвертации $zcvt с опцией бинарного формата обнаружила
недопустимый размер входного параметра.
READ
Операция чтения не применима к устройству, устройство в состоянии
только на запись.
Физический обмен данными завершился ошибкой.
SELECT
Ни одна из альтернатив функции $select не выполнилась успешно.
SELECTARGS
Функция $select указана с недопустимо большим количеством альтернатив, максимум - 255.
STORE
Исчерпан лимит памяти локальных переменных.
SSVN VALUE
Чтение указанной структурной системной переменной не поддерживается.
SSVNSUBSCRIPT
В качестве индекса структурной системной переменной использовано
недопустимое значение.
Структурной системной переменной задано неподдерживаемое количество индексов.
STACKLIMIT
Превышение допустимого количества уровней стека исполнения. Величина настраивается в файле minim.ini, секция Process, ключ FrameCount,
значение по умолчанию 1024.
394
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
STRINGSTACK
Исчерпана временная память для вычисления промежуточных значений.
SUBSCRIPT
Пустая строка в качестве значения индекса не поддерживается.
Превышение допустимого количества индексов (63).
Превышение общей длины имени (255 байт).
SYNTAX
Синтаксическая ошибка - недопустимые пробелы, недопустимая команда, имя системной функции, системной или структурной системной
переменной, недопустимый оператор, недопустимая пунктуация.
Недопустимое значение косвенного аргумента команды.
SYNTAX INDEX LIMIT
Синтаксическая ошибка, превышение допустимого количества индексов (63).
TLEVEL
Команда превысила максимально возможный уровень вложения транзакций.
UNDEFINED
Попытка чтения неопределённой локальной или глобальной переменной.
Переменная цикла (команды for) получила неопределённое значение.
UNIMPLEMENTED
Команда, параметры команды, функция, системная или структурная
системная переменная не поддерживаются.
WRITE
Операция записи для текущего устройства запрещена, устройство в
состоянии только на чтение.
Операция физического обмена данными завершилась ошибкой.
13.3
Список системных ошибок MiniM
Ниже описаны коды системных ошибок системы MiniM, при обнаружении ошибочной ситуации ошибки протоколируются в файле minim.log.
13.3. СПИСОК СИСТЕМНЫХ ОШИБОК MINIM
395
К описаниям ошибок даются краткие пояснения сути их появления и
возможные варианты решения проблем.
Ошибка № 0. Программа не смогла найти файл с описанием формата
ошибки. Файл из состава дистрибутива MiniM с именем minimerr.ini
должен находиться в каталоге /bin и быть доступен на чтение. Если Ваш
дистрибутив содержит локализованные версии этого файла, например
minimerr.dan.ini, можете скопировать его в файл minimerr.ini.
Ошибка № 1. Программа не смогла найти имя текущей инсталляции, описанное в файле minim.ini в секции Server. Требуется ключ
InstallName, текстовая строка без пробелов, длиной до 31 символа. Например:
InstallName = MINIM00
Ошибка № 2. Не удалось создать объект синхронизации. При возникновении такой ошибки рекомендуется сообщить разработчику с точным
указанием кода ошибки. Никаких мер для исправления такой ошибки
предпринять, видимо, будет недостаточно, это серьезный сбой в операционном окружении сервера. Ошибка свидетельствует о недостаточности
системных ресурсов.
Ошибка № 3. Не удалось открыть файл minim.log на запись. Проверьте, что у процессов сервера достаточно прав для записи в этот файл,
и что файл лога не заблокирован никаким другим процессом. Отсутствие
возможности записать в файл лога не должно приводить к нарушению
файлов баз данных, но в некоторых ситуациях может поставить процесс
в безвыходное положение и привести к прекращению его работы.
Ошибка № 4. Не удалось удалить предыдущий файл minim.log.bak.
Проверьте, что у процессов сервера достаточно прав для удаления этого
файла. Отсутствие возможности его удалить приводит к потере части
лога. Эта ошибка не должна приводить к нарушению файлов баз данных.
Ошибка № 5. Не удалось переименовать файл minim.log в minim.log.bak.
Проверьте, что у процессов сервера достаточно прав для переименования
этих файлов. Невозможность переименования файлов приводит к потере части лога работы сервера и не должна приводить к повреждению
файлов баз данных.
Ошибка № 6. Не удалось сделать запись в файл minim.log. Проверьте, что у процессов сервера достаточно прав для записи в файл лога, и
что на диске с файлом есть достаточно места для его роста. Невозможность записи в файл лога приводит к потере части записей лога и не
должна приводить к нарушению работы файлов баз данных.
396
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
Ошибка № 7. Не удалось получить временную память процесса. Это
серьёзная ошибка, свидетельствующая о серьёзном сбое в операционном
окружении сервера. Процесс должен прекратить работу. Для устранения проблемы, вероятно, может понадобиться увеличение оперативной /
виртуальной памяти компьютера или переход на более старшую версию
операционной системы, например на Windows 2000 DataCenter.
Ошибка № 8. Не удалось загрузить файл локализации %s.N, либо
он нарушен. Ошибка означает, что в инициализационном файле указана
локализация инсталляции, для которой отсутствует файл локализации.
Файл должен находиться в каталоге /nat, содержать три символа в имени, букву N в расширении и иметь длину 768 байт. Этот файл содержит три кодировочные таблицы, используемые для операций сравнения
строк, поднятия и опускания регистра.
Ошибка № 9. Ошибка открытия общей памяти сервера. Очень серьёзная ошибка, препятствующая работе сервера. Может быть вызвана
недостаточностью имеющихся на компьютере ресурсов.
Ошибка № 10. Ошибка обращения к общей памяти сервера. Очень
серьёзная ошибка, препятствующая работе сервера. Может быть вызвана
недостаточностью имеющихся на компьютере ресурсов.
Ошибка № 11. Ошибка создания общей памяти сервера. Очень серьёзная ошибка, препятствующая работе сервера. Может быть вызвана
недостаточностью имеющихся на компьютере ресурсов.
Ошибка № 12. Не удалось создать объект синхронизации блокировок. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной системе закончились возможности создания системных объектов. При возникновении
этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы сервера MiniM
с другими работающими в данный момент программами.
Ошибка № 13. Не удалось создать объект общей памяти для блокировок. Это серьёзная ошибка, препятствующая нормальной работе сервера.
Рекомендуется освободить для сервера MiniM ресурсы компьютера - общую память и увеличить размер файла подкачки.
Ошибка № 14. Не удалось корректно использовать объект общей
памяти для блокировок. Это серьёзная ошибка, препятствующая нормальной работе сервера. Рекомендуется освободить для сервера MiniM
ресурсы компьютера - общую память и увеличить размер файла подкачки.
13.3. СПИСОК СИСТЕМНЫХ ОШИБОК MINIM
397
Ошибка № 15. Ошибка открытия общей памяти конфигурации сервера. Очень серьёзная ошибка, препятствующая работе сервера. Может
быть вызвана недостаточностью имеющихся на компьютере ресурсов.
Ошибка № 16. Ошибка обращения к общей памяти конфигурации
сервера. Очень серьёзная ошибка, препятствующая работе сервера. Может быть вызвана недостаточностью имеющихся на компьютере ресурсов.
Ошибка № 17. Ошибка создания объекта общей памяти конфигурации сервера. Очень серьёзная ошибка, препятствующая работе сервера.
Может быть вызвана недостаточностью имеющихся на компьютере ресурсов.
Ошибка № 18. Файл конфигурации не содержит описания ни одной
базы данных. При отсутствии описанных в конфигурации баз данных
сервер работать не может. Требуется описать, по крайней мере, базы
данных %sys и temp. В типовое описание баз данных входят описания
для баз %sys, temp, user.
Ошибка № 19. В описании одной из баз данных отсутствует описание
корневого файла. Корневой файл должен быть обязательно.
Ошибка № 20. В описании одной из баз данных неверно задано
описание экстента. Формат описания экстента должен начинаться со
слова extent, после чего должно следовать число. Например:
extent1 = disk:/filename1.dat
extent2 = disk:/filename2.dat
extent3 = disk:/filename3.dat
Ошибка № 21. Неверно указан номер экстента в описании одной из
баз данных. Формат описания экстента:
extentNNN = filename,
где NNN - номер экстента в десятичном представлении. Экстенты должны следовать в описании конфигурации базы данных в порядке возрастания их номеров.
Ошибка № 22. В описании конфигурации базы данных присутствует неподдерживаемый ключ. Проверьте ключи файла конфигурации баз
данных minimdb.ini.
Ошибка № 23. Превышена длина имени базы данных в описании
конфигурации баз данных minimdb.ini. Разрешённая текущей версией
MiniM длина имени базы указана в файле сообщений minim.log.
398
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
Ошибка № 24. Превышена длина имени файла в описании конфигурации баз данных minimdb.ini. Разрешённая текущей версией MiniM
длина имени файла указана в файле сообщений minim.log.
Ошибка № 25. Имя базы данных содержит недопустимые символы. В
каком именно имени встретился недопустимый символ, указано в файле
сообщений minim.log.
Ошибка № 26. Не удалось создать объект синхронизации блокировок
страниц. Это очень серьёзная ошибка, препятствующая работе сервера.
Появление этой ошибки говорит о том, что в операционной системе закончились возможности создания системных объектов. При возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы сервера
MiniM с другими работающими в данный момент программами.
Ошибка № 27. Не удалось создать объект общей памяти кэширования страниц. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной системе
закончились возможности создания системных объектов. При возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы сервера
MiniM с другими работающими в данный момент программами.
Ошибка № 28. Не удалось создать объект общей памяти дескрипторов кэширования страниц. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной системе закончились возможности создания системных объектов. При возникновении этой ошибки нормальная работа сервера MiniM
невозможна. Рекомендуется пересмотреть возможность одновременной
работы сервера MiniM с другими работающими в данный момент программами.
Ошибка № 29. Не удалось создать объект общей памяти очереди кэширования страниц. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной
системе закончились возможности создания системных объектов. При
возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы
сервера MiniM с другими работающими в данный момент программами.
Ошибка № 30. Не удалось создать объект синхронизации кэширования страниц. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной системе
13.3. СПИСОК СИСТЕМНЫХ ОШИБОК MINIM
399
закончились возможности создания системных объектов. При возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы сервера
MiniM с другими работающими в данный момент программами.
Ошибка № 31. Не удалось создать объект общей памяти семафоров
кэширования страниц. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной
системе закончились возможности создания системных объектов. При
возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы
сервера MiniM с другими работающими в данный момент программами.
Ошибка № 32. Не удалось создать объект семафора кэширования
страниц. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной системе
закончились возможности создания системных объектов. При возникновении этой ошибки нормальная работа сервера MiniM невозможна.
Рекомендуется пересмотреть возможность одновременной работы сервера MiniM с другими работающими в данный момент программами.
Ошибка № 33. Не удалось создать объект общей памяти для статистик сервера. Это серьёзная ошибка, препятствующая нормальной работе
сервера. Рекомендуется освободить для сервера MiniM ресурсы компьютера - общую память и увеличить размер файла подкачки.
Ошибка № 34. Не удалось корректно использовать объект общей
памяти для статистик сервера. Это серьёзная ошибка, препятствующая нормальной работе сервера. Рекомендуется освободить для сервера
MiniM ресурсы компьютера - общую память и увеличить размер файла
подкачки.
Ошибка № 35. Не удалось создать объект синхронизации демона
записи кэша. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной системе
закончились возможности создания системных объектов. При возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы сервера
MiniM с другими работающими в данный момент программами.
Ошибка № 36. Не удалось создать объект синхронизации демона
журналирования. Это очень серьёзная ошибка, препятствующая работе сервера. Появление этой ошибки говорит о том, что в операционной
системе закончились возможности создания системных объектов. При
400
ГЛАВА 13. ПЕРЕЧЕНЬ ОШИБОК
возникновении этой ошибки нормальная работа сервера MiniM невозможна. Рекомендуется пересмотреть возможность одновременной работы
сервера MiniM с другими работающими в данный момент программами.
Ошибка № 37. Не удалось создать объект общей памяти для демона
журналирования. Это серьёзная ошибка, препятствующая нормальной
работе сервера. Рекомендуется освободить для сервера MiniM ресурсы
компьютера - общую память и увеличить размер файла подкачки.
Ошибка № 38. Ошибка чтения заголовка файла журнала. Это критическая ошибка, препятствующая нормальной работе сервера. Проверьте,
что файл не заблокирован, и нет сбоя в файловой системе.
Ошибка № 39. Ошибка записи заголовка файла журнала. Это критическая ошибка, препятствующая нормальной работе сервера. Проверьте,
что файл не заблокирован и нет сбоя в файловой системе.
Ошибка № 40. Ошибка записи в текущий журнал. Проверьте, что
есть место на диске, где расположен файл журнала, и у процессов сервера MiniM достаточно прав на запись в журнал. Невозможность записи
в журнал это критическая ошибка, нормальная работа сервера невозможна.
Ошибка № 41. Ошибка открытия файла предзаписи. Это критическая
ошибка, препятствующая выполнению операций с базами данных. Проверьте, что у процессов сервера MiniM достаточно возможностей для
открытия и использования файла minim.bij. Сервер принимает меры к
использованию объявленных баз данных в режиме только на чтение.
Ошибка № 42. Ошибка записи в файл предзаписи. Это критическая
ошибка, препятствующая выполнению операций с базами данных. Проверьте, что у процессов сервера MiniM достаточно возможностей для использования файла minim.bij. Сервер принимает меры к использованию
объявленных баз данных в режиме только на чтение. При происхождении этой ошибки рекомендуется удалить файл предзаписи и выполнить
восстановление баз из последнего бекапа.
Ошибка № 43. Ошибка создания разделяемой области для кэша рутин. Это критическая ошибка, препятствующая выполнению операций
с рутинами сервера. Проверьте, что в файле конфигурации minim.ini
указано разумное количество памяти для кэшей рутин и глобалов.
Скачать