Add lrexlib-pcre through luarocks.
[jackhill/mal.git] / impls / plsql / types.sql
CommitLineData
97df14cd
JM
1-- ---------------------------------------------------------
2-- persistent values
3
97df14cd 4BEGIN
2866f9a8 5 EXECUTE IMMEDIATE 'DROP TYPE mal_T FORCE';
97df14cd
JM
6EXCEPTION
7 WHEN OTHERS THEN IF SQLCODE != -4043 THEN RAISE; END IF;
8END;
9/
10
11-- list of types for type_id
12-- 0: nil
13-- 1: false
14-- 2: true
15-- 3: integer
16-- 4: float
17-- 5: string
02936b42 18-- 6: long string (CLOB)
97df14cd
JM
19-- 7: symbol
20-- 8: list
21-- 9: vector
22-- 10: hashmap
23-- 11: function
24-- 12: malfunc
25-- 13: atom
26
9fc524f1 27-- nil (0), false (1), true (2)
2866f9a8 28CREATE OR REPLACE TYPE mal_T FORCE AS OBJECT (
97df14cd
JM
29 type_id integer
30) NOT FINAL;
31/
32
2866f9a8
JM
33-- general nested table of mal values (integers)
34-- used frequently for argument passing
35CREATE OR REPLACE TYPE mal_vals FORCE AS TABLE OF integer;
36/
37
38
9fc524f1 39-- integer (3)
2866f9a8 40CREATE OR REPLACE TYPE mal_int_T FORCE UNDER mal_T (
97df14cd
JM
41 val_int integer
42) FINAL;
43/
44
02936b42 45-- string/keyword (5,6), symbol (7)
2866f9a8 46CREATE OR REPLACE TYPE mal_str_T FORCE UNDER mal_T (
97df14cd 47 val_str varchar2(4000)
02936b42
JM
48) NOT FINAL;
49/
50
2866f9a8 51CREATE OR REPLACE TYPE mal_long_str_T FORCE UNDER mal_str_T (
02936b42 52 val_long_str CLOB -- long character object (for larger than 4000 chars)
97df14cd
JM
53) FINAL;
54/
02936b42 55show errors;
97df14cd 56
9fc524f1 57-- list (8), vector (9)
2866f9a8
JM
58CREATE OR REPLACE TYPE mal_seq_T FORCE UNDER mal_T (
59 val_seq mal_vals,
6a085103
JM
60 meta integer
61) FINAL;
62/
63
2866f9a8 64CREATE OR REPLACE TYPE mal_map_T FORCE UNDER mal_T (
6a085103
JM
65 map_idx integer, -- index into map entry table
66 meta integer
97df14cd
JM
67) FINAL;
68/
69
9fc524f1 70-- malfunc (12)
2866f9a8 71CREATE OR REPLACE TYPE mal_func_T FORCE UNDER mal_T (
0fc03918
JM
72 ast integer,
73 params integer,
74 env integer,
6a085103
JM
75 is_macro integer,
76 meta integer
9fc524f1
JM
77) FINAL;
78/
97df14cd 79
06951f55 80-- atom (13)
2866f9a8
JM
81CREATE OR REPLACE TYPE mal_atom_T FORCE UNDER mal_T (
82 val integer -- index into mal_table
0fc03918 83);
06951f55
JM
84/
85
97df14cd 86
7836cfa3 87-- ---------------------------------------------------------
97df14cd 88
0fc03918 89CREATE OR REPLACE PACKAGE types IS
2866f9a8
JM
90 -- memory pool for mal_objects (non-hash-map)
91 TYPE mal_table IS TABLE OF mal_T;
92
93 -- memory pool for hash-map objects
6a085103
JM
94 TYPE map_entry IS TABLE OF integer INDEX BY varchar2(256);
95 TYPE map_entry_table IS TABLE OF map_entry;
96
7836cfa3 97 -- general functions
2866f9a8 98 FUNCTION mem_new RETURN mal_table;
0fc03918 99
6a085103 100 FUNCTION tf(val boolean) RETURN integer;
2866f9a8 101 FUNCTION equal_Q(M IN OUT NOCOPY mal_table,
6a085103 102 H IN OUT NOCOPY map_entry_table,
0fc03918 103 a integer, b integer) RETURN boolean;
97df14cd 104
2866f9a8 105 FUNCTION clone(M IN OUT NOCOPY mal_table,
6a085103
JM
106 H IN OUT NOCOPY map_entry_table,
107 obj integer,
108 meta integer DEFAULT 1) RETURN integer;
109
7836cfa3 110 -- scalar functions
2866f9a8
JM
111 FUNCTION int(M IN OUT NOCOPY mal_table, num integer) RETURN integer;
112 FUNCTION string(M IN OUT NOCOPY mal_table, name varchar) RETURN integer;
113 FUNCTION string_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean;
114 FUNCTION symbol(M IN OUT NOCOPY mal_table, name varchar) RETURN integer;
115 FUNCTION keyword(M IN OUT NOCOPY mal_table, name varchar) RETURN integer;
116 FUNCTION keyword_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean;
aa42fdce
JM
117 FUNCTION number_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean;
118 FUNCTION function_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean;
119 FUNCTION macro_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean;
97df14cd 120
7836cfa3 121 -- sequence functions
2866f9a8 122 FUNCTION seq(M IN OUT NOCOPY mal_table,
6a085103 123 type_id integer,
2866f9a8 124 items mal_vals,
6a085103 125 meta integer DEFAULT 1) RETURN integer;
2866f9a8
JM
126 FUNCTION list(M IN OUT NOCOPY mal_table) RETURN integer;
127 FUNCTION list(M IN OUT NOCOPY mal_table,
0fc03918 128 a integer) RETURN integer;
2866f9a8 129 FUNCTION list(M IN OUT NOCOPY mal_table,
0fc03918 130 a integer, b integer) RETURN integer;
2866f9a8 131 FUNCTION list(M IN OUT NOCOPY mal_table,
0fc03918 132 a integer, b integer, c integer) RETURN integer;
2866f9a8
JM
133
134 FUNCTION first(M IN OUT NOCOPY mal_table,
135 seq integer) RETURN integer;
136 FUNCTION slice(M IN OUT NOCOPY mal_table,
137 seq integer,
138 idx integer,
139 last integer DEFAULT NULL) RETURN integer;
140 FUNCTION slice(M IN OUT NOCOPY mal_table,
141 items mal_vals,
6a085103 142 idx integer) RETURN integer;
2866f9a8
JM
143 FUNCTION islice(items mal_vals,
144 idx integer) RETURN mal_vals;
145 FUNCTION nth(M IN OUT NOCOPY mal_table,
0fc03918
JM
146 seq integer, idx integer) RETURN integer;
147
2866f9a8 148 FUNCTION count(M IN OUT NOCOPY mal_table,
0fc03918
JM
149 seq integer) RETURN integer;
150
2866f9a8 151 FUNCTION atom_new(M IN OUT NOCOPY mal_table,
0fc03918 152 val integer) RETURN integer;
2866f9a8
JM
153 FUNCTION atom_reset(M IN OUT NOCOPY mal_table,
154 atm integer,
155 val integer) RETURN integer;
0fc03918 156
6a085103 157 -- hash-map functions
2866f9a8 158 FUNCTION assoc_BANG(M IN OUT NOCOPY mal_table,
6a085103
JM
159 H IN OUT NOCOPY map_entry_table,
160 midx integer,
2866f9a8
JM
161 kvs mal_vals) RETURN integer;
162 FUNCTION dissoc_BANG(M IN OUT NOCOPY mal_table,
6a085103
JM
163 H IN OUT NOCOPY map_entry_table,
164 midx integer,
2866f9a8
JM
165 ks mal_vals) RETURN integer;
166 FUNCTION hash_map(M IN OUT NOCOPY mal_table,
6a085103 167 H IN OUT NOCOPY map_entry_table,
2866f9a8 168 kvs mal_vals,
6a085103
JM
169 meta integer DEFAULT 1) RETURN integer;
170
0fc03918 171 -- function functions
2866f9a8
JM
172 FUNCTION func(M IN OUT NOCOPY mal_table, name varchar) RETURN integer;
173 FUNCTION malfunc(M IN OUT NOCOPY mal_table,
0fc03918
JM
174 ast integer,
175 params integer,
176 env integer,
6a085103
JM
177 is_macro integer DEFAULT 0,
178 meta integer DEFAULT 1) RETURN integer;
0fc03918 179END types;
7836cfa3 180/
2866f9a8
JM
181show errors;
182
7836cfa3 183
0fc03918 184CREATE OR REPLACE PACKAGE BODY types IS
97df14cd 185
9fc524f1
JM
186-- ---------------------------------------------------------
187-- general functions
188
2866f9a8 189FUNCTION mem_new RETURN mal_table IS
0fc03918
JM
190BEGIN
191 -- initialize mal type memory pool
192 -- 1 -> nil
193 -- 2 -> false
194 -- 3 -> true
2866f9a8 195 RETURN mal_table(mal_T(0), mal_T(1), mal_T(2));
0fc03918 196END;
9fc524f1 197
6a085103 198FUNCTION tf(val boolean) RETURN integer IS
9fc524f1
JM
199BEGIN
200 IF val THEN
0fc03918 201 RETURN 3; -- true
9fc524f1 202 ELSE
0fc03918 203 RETURN 2; -- false
9fc524f1
JM
204 END IF;
205END;
206
2866f9a8 207FUNCTION equal_Q(M IN OUT NOCOPY mal_table,
6a085103 208 H IN OUT NOCOPY map_entry_table,
0fc03918 209 a integer, b integer) RETURN boolean IS
6a085103
JM
210 atyp integer;
211 btyp integer;
2866f9a8
JM
212 aseq mal_vals;
213 bseq mal_vals;
6a085103
JM
214 amidx integer;
215 bmidx integer;
216 i integer;
217 k varchar2(256);
9fc524f1 218BEGIN
0fc03918
JM
219 atyp := M(a).type_id;
220 btyp := M(b).type_id;
221 IF NOT (atyp = btyp OR (atyp IN (8,9) AND btyp IN (8,9))) THEN
9fc524f1
JM
222 RETURN FALSE;
223 END IF;
224
225 CASE
0fc03918 226 WHEN atyp IN (0,1,2) THEN
9fc524f1 227 RETURN TRUE;
0fc03918 228 WHEN atyp = 3 THEN
2866f9a8
JM
229 RETURN TREAT(M(a) AS mal_int_T).val_int =
230 TREAT(M(b) AS mal_int_T).val_int;
02936b42 231 WHEN atyp IN (5,6,7) THEN
2866f9a8
JM
232 IF TREAT(M(a) AS mal_str_T).val_str IS NULL AND
233 TREAT(M(b) AS mal_str_T).val_str IS NULL THEN
9fc524f1
JM
234 RETURN TRUE;
235 ELSE
2866f9a8
JM
236 RETURN TREAT(M(a) AS mal_str_T).val_str =
237 TREAT(M(b) AS mal_str_T).val_str;
9fc524f1 238 END IF;
0fc03918 239 WHEN atyp IN (8,9) THEN
2866f9a8
JM
240 aseq := TREAT(M(a) AS mal_seq_T).val_seq;
241 bseq := TREAT(M(b) AS mal_seq_T).val_seq;
9fc524f1
JM
242 IF aseq.COUNT <> bseq.COUNT THEN
243 RETURN FALSE;
244 END IF;
245 FOR i IN 1..aseq.COUNT LOOP
6a085103 246 IF NOT equal_Q(M, H, aseq(i), bseq(i)) THEN
9fc524f1
JM
247 RETURN FALSE;
248 END IF;
249 END LOOP;
250 RETURN TRUE;
6a085103 251 WHEN atyp = 10 THEN
2866f9a8
JM
252 amidx := TREAT(M(a) AS mal_map_T).map_idx;
253 bmidx := TREAT(M(b) AS mal_map_T).map_idx;
6a085103
JM
254 IF H(amidx).COUNT() <> H(bmidx).COUNT() THEN
255 RETURN FALSE;
256 END IF;
257
258 k := H(amidx).FIRST();
259 WHILE k IS NOT NULL LOOP
260 IF H(amidx)(k) IS NULL OR H(bmidx)(k) IS NULL THEN
261 RETURN FALSE;
262 END IF;
263 IF NOT equal_Q(M, H, H(amidx)(k), H(bmidx)(k)) THEN
264 RETURN FALSE;
265 END IF;
266 k := H(amidx).NEXT(k);
267 END LOOP;
268 RETURN TRUE;
9fc524f1
JM
269 ELSE
270 RETURN FALSE;
271 END CASE;
272END;
97df14cd 273
2866f9a8 274FUNCTION clone(M IN OUT NOCOPY mal_table,
6a085103
JM
275 H IN OUT NOCOPY map_entry_table,
276 obj integer,
277 meta integer DEFAULT 1) RETURN integer IS
278 type_id integer;
279 new_hm integer;
280 old_midx integer;
281 new_midx integer;
282 k varchar2(256);
2866f9a8 283 malfn mal_func_T;
6a085103
JM
284BEGIN
285 type_id := M(obj).type_id;
286 CASE
287 WHEN type_id IN (8,9) THEN -- list/vector
288 RETURN seq(M, type_id,
2866f9a8 289 TREAT(M(obj) AS mal_seq_T).val_seq,
6a085103
JM
290 meta);
291 WHEN type_id = 10 THEN -- hash-map
2866f9a8
JM
292 new_hm := types.hash_map(M, H, mal_vals(), meta);
293 old_midx := TREAT(M(obj) AS mal_map_T).map_idx;
294 new_midx := TREAT(M(new_hm) AS mal_map_T).map_idx;
6a085103
JM
295
296 k := H(old_midx).FIRST();
297 WHILE k IS NOT NULL LOOP
298 H(new_midx)(k) := H(old_midx)(k);
299 k := H(old_midx).NEXT(k);
300 END LOOP;
301
302 RETURN new_hm;
303 WHEN type_id = 12 THEN -- mal function
2866f9a8 304 malfn := TREAT(M(obj) AS mal_func_T);
6a085103
JM
305 RETURN types.malfunc(M,
306 malfn.ast,
307 malfn.params,
308 malfn.env,
309 malfn.is_macro,
310 meta);
311 ELSE
312 raise_application_error(-20008,
313 'clone not supported for type ' || type_id, TRUE);
314 END CASE;
315END;
7836cfa3
JM
316
317
318-- ---------------------------------------------------------
319-- scalar functions
320
321
2866f9a8 322FUNCTION int(M IN OUT NOCOPY mal_table, num integer) RETURN integer IS
0fc03918
JM
323BEGIN
324 M.EXTEND();
2866f9a8 325 M(M.COUNT()) := mal_int_T(3, num);
0fc03918
JM
326 RETURN M.COUNT();
327END;
328
2866f9a8 329FUNCTION string(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS
6a085103
JM
330BEGIN
331 M.EXTEND();
02936b42 332 IF LENGTH(name) <= 4000 THEN
2866f9a8 333 M(M.COUNT()) := mal_str_T(5, name);
02936b42 334 ELSE
2866f9a8 335 M(M.COUNT()) := mal_long_str_T(6, NULL, name);
02936b42 336 END IF;
6a085103
JM
337 RETURN M.COUNT();
338END;
339
2866f9a8 340FUNCTION string_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS
02936b42 341 str CLOB;
6a085103 342BEGIN
02936b42
JM
343 IF M(val).type_id IN (5,6) THEN
344 IF M(val).type_id = 5 THEN
2866f9a8 345 str := TREAT(M(val) AS mal_str_T).val_str;
02936b42 346 ELSE
2866f9a8 347 str := TREAT(M(val) AS mal_long_str_T).val_long_str;
02936b42
JM
348 END IF;
349 IF str IS NULL OR
350 str = EMPTY_CLOB() OR
351 SUBSTR(str, 1, 1) <> chr(127) THEN
6a085103
JM
352 RETURN TRUE;
353 ELSE
354 RETURN FALSE;
355 END IF;
356 ELSE
357 RETURN FALSE;
358 END IF;
359END;
360
2866f9a8 361FUNCTION symbol(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS
0fc03918
JM
362BEGIN
363 M.EXTEND();
2866f9a8 364 M(M.COUNT()) := mal_str_T(7, name);
0fc03918
JM
365 RETURN M.COUNT();
366END;
367
2866f9a8 368FUNCTION keyword(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS
7836cfa3 369BEGIN
0fc03918 370 M.EXTEND();
2866f9a8 371 M(M.COUNT()) := mal_str_T(5, chr(127) || name);
0fc03918 372 RETURN M.COUNT();
7836cfa3
JM
373END;
374
2866f9a8 375FUNCTION keyword_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS
02936b42 376 str CLOB;
6a085103
JM
377BEGIN
378 IF M(val).type_id = 5 THEN
2866f9a8 379 str := TREAT(M(val) AS mal_str_T).val_str;
6a085103
JM
380 IF LENGTH(str) > 0 AND SUBSTR(str, 1, 1) = chr(127) THEN
381 RETURN TRUE;
382 ELSE
383 RETURN FALSE;
384 END IF;
385 ELSE
386 RETURN FALSE;
387 END IF;
388END;
7836cfa3 389
aa42fdce
JM
390FUNCTION number_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS
391 str CLOB;
392BEGIN
393 IF M(val).type_id IN (3,4) THEN
394 RETURN TRUE;
395 ELSE
396 RETURN FALSE;
397 END IF;
398END;
399
400FUNCTION function_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS
401 str CLOB;
402BEGIN
403 IF M(val).type_id = 11 THEN
404 RETURN TRUE;
405 ELSIF M(val).type_id = 12 THEN
406 RETURN TREAT(M(val) AS mal_func_T).is_macro = 0;
407 ELSE
408 RETURN FALSE;
409 END IF;
410END;
411
412FUNCTION macro_Q(M IN OUT NOCOPY mal_table, val integer) RETURN boolean IS
413 str CLOB;
414BEGIN
415 IF M(val).type_id = 12 THEN
416 RETURN TREAT(M(val) AS mal_func_T).is_macro > 0;
417 ELSE
418 RETURN FALSE;
419 END IF;
420END;
421
0fc03918 422
7836cfa3
JM
423-- ---------------------------------------------------------
424-- sequence functions
97df14cd 425
2866f9a8 426FUNCTION seq(M IN OUT NOCOPY mal_table,
6a085103 427 type_id integer,
2866f9a8 428 items mal_vals,
6a085103 429 meta integer DEFAULT 1) RETURN integer IS
97df14cd 430BEGIN
0fc03918 431 M.EXTEND();
2866f9a8 432 M(M.COUNT()) := mal_seq_T(type_id, items, meta);
0fc03918 433 RETURN M.COUNT();
97df14cd
JM
434END;
435
0fc03918
JM
436-- list:
437-- return a mal list
2866f9a8 438FUNCTION list(M IN OUT NOCOPY mal_table) RETURN integer IS
97df14cd 439BEGIN
0fc03918 440 M.EXTEND();
2866f9a8 441 M(M.COUNT()) := mal_seq_T(8, mal_vals(), 1);
0fc03918 442 RETURN M.COUNT();
97df14cd
JM
443END;
444
2866f9a8 445FUNCTION list(M IN OUT NOCOPY mal_table,
0fc03918 446 a integer) RETURN integer IS
97df14cd 447BEGIN
0fc03918 448 M.EXTEND();
2866f9a8 449 M(M.COUNT()) := mal_seq_T(8, mal_vals(a), 1);
0fc03918 450 RETURN M.COUNT();
97df14cd
JM
451END;
452
2866f9a8 453FUNCTION list(M IN OUT NOCOPY mal_table,
0fc03918 454 a integer, b integer) RETURN integer IS
97df14cd 455BEGIN
0fc03918 456 M.EXTEND();
2866f9a8 457 M(M.COUNT()) := mal_seq_T(8, mal_vals(a, b), 1);
0fc03918 458 RETURN M.COUNT();
97df14cd
JM
459END;
460
2866f9a8 461FUNCTION list(M IN OUT NOCOPY mal_table,
0fc03918 462 a integer, b integer, c integer) RETURN integer IS
9fc524f1 463BEGIN
0fc03918 464 M.EXTEND();
2866f9a8 465 M(M.COUNT()) := mal_seq_T(8, mal_vals(a, b, c), 1);
0fc03918 466 RETURN M.COUNT();
9fc524f1
JM
467END;
468
2866f9a8 469FUNCTION first(M IN OUT NOCOPY mal_table,
0fc03918 470 seq integer) RETURN integer IS
7836cfa3 471BEGIN
2866f9a8 472 RETURN TREAT(M(seq) AS mal_seq_T).val_seq(1);
7836cfa3
JM
473END;
474
2866f9a8 475FUNCTION slice(M IN OUT NOCOPY mal_table,
0fc03918
JM
476 seq integer,
477 idx integer,
478 last integer DEFAULT NULL) RETURN integer IS
2866f9a8
JM
479 old_items mal_vals;
480 new_items mal_vals;
7836cfa3 481 i integer;
0fc03918 482 final_idx integer;
7836cfa3 483BEGIN
2866f9a8
JM
484 old_items := TREAT(M(seq) AS mal_seq_T).val_seq;
485 new_items := mal_vals();
0fc03918
JM
486 IF last IS NULL THEN
487 final_idx := old_items.COUNT();
488 ELSE
489 final_idx := last + 1;
490 END IF;
10cc781f
JM
491 IF final_idx > idx THEN
492 new_items.EXTEND(final_idx - idx);
493 FOR i IN idx+1..final_idx LOOP
494 new_items(i-idx) := old_items(i);
495 END LOOP;
496 END IF;
0fc03918 497 M.EXTEND();
2866f9a8 498 M(M.COUNT()) := mal_seq_T(8, new_items, 1);
0fc03918 499 RETURN M.COUNT();
7836cfa3
JM
500END;
501
2866f9a8
JM
502FUNCTION slice(M IN OUT NOCOPY mal_table,
503 items mal_vals,
6a085103 504 idx integer) RETURN integer IS
2866f9a8 505 new_items mal_vals;
6a085103
JM
506BEGIN
507 new_items := islice(items, idx);
508 M.EXTEND();
2866f9a8 509 M(M.COUNT()) := mal_seq_T(8, new_items, 1);
6a085103
JM
510 RETURN M.COUNT();
511END;
512
2866f9a8
JM
513FUNCTION islice(items mal_vals,
514 idx integer) RETURN mal_vals IS
515 new_items mal_vals;
9fc524f1
JM
516 i integer;
517BEGIN
2866f9a8 518 new_items := mal_vals();
10cc781f
JM
519 IF items.COUNT > idx THEN
520 new_items.EXTEND(items.COUNT - idx);
521 FOR i IN idx+1..items.COUNT LOOP
522 new_items(i-idx) := items(i);
523 END LOOP;
524 END IF;
6a085103 525 RETURN new_items;
9fc524f1
JM
526END;
527
6a085103 528
2866f9a8 529FUNCTION nth(M IN OUT NOCOPY mal_table,
0fc03918 530 seq integer, idx integer) RETURN integer IS
7836cfa3 531BEGIN
2866f9a8 532 RETURN TREAT(M(seq) AS mal_seq_T).val_seq(idx+1);
7836cfa3 533END;
97df14cd 534
2866f9a8 535FUNCTION count(M IN OUT NOCOPY mal_table,
0fc03918 536 seq integer) RETURN integer IS
9fc524f1 537BEGIN
2866f9a8 538 RETURN TREAT(M(seq) AS mal_seq_T).val_seq.COUNT;
9fc524f1
JM
539END;
540
6a085103
JM
541-- ---------------------------------------------------------
542-- hash-map functions
543
2866f9a8 544FUNCTION assoc_BANG(M IN OUT NOCOPY mal_table,
6a085103
JM
545 H IN OUT NOCOPY map_entry_table,
546 midx integer,
2866f9a8 547 kvs mal_vals) RETURN integer IS
6a085103
JM
548 i integer;
549BEGIN
550 IF MOD(kvs.COUNT(), 2) = 1 THEN
551 raise_application_error(-20007,
552 'odd number of arguments to assoc', TRUE);
553 END IF;
554
555 i := 1;
556 WHILE i <= kvs.COUNT() LOOP
2866f9a8 557 H(midx)(TREAT(M(kvs(i)) AS mal_str_T).val_str) := kvs(i+1);
6a085103
JM
558 i := i + 2;
559 END LOOP;
560 RETURN midx;
561END;
562
2866f9a8 563FUNCTION dissoc_BANG(M IN OUT NOCOPY mal_table,
6a085103
JM
564 H IN OUT NOCOPY map_entry_table,
565 midx integer,
2866f9a8 566 ks mal_vals) RETURN integer IS
6a085103
JM
567 i integer;
568BEGIN
569 FOR i IN 1..ks.COUNT() LOOP
2866f9a8 570 H(midx).DELETE(TREAT(M(ks(i)) AS mal_str_T).val_str);
6a085103
JM
571 END LOOP;
572 RETURN midx;
573END;
574
2866f9a8 575FUNCTION hash_map(M IN OUT NOCOPY mal_table,
6a085103 576 H IN OUT NOCOPY map_entry_table,
2866f9a8 577 kvs mal_vals,
6a085103
JM
578 meta integer DEFAULT 1) RETURN integer IS
579 midx integer;
580BEGIN
581 H.EXTEND();
582 midx := H.COUNT();
583 midx := assoc_BANG(M, H, midx, kvs);
584
585 M.EXTEND();
2866f9a8 586 M(M.COUNT()) := mal_map_T(10, midx, meta);
6a085103
JM
587 RETURN M.COUNT();
588END;
0fc03918
JM
589
590
591-- ---------------------------------------------------------
592-- function functions
593
2866f9a8 594FUNCTION func(M IN OUT NOCOPY mal_table, name varchar) RETURN integer IS
0fc03918
JM
595BEGIN
596 M.EXTEND();
2866f9a8 597 M(M.COUNT()) := mal_str_T(11, name);
0fc03918
JM
598 RETURN M.COUNT();
599END;
600
2866f9a8 601FUNCTION malfunc(M IN OUT NOCOPY mal_table,
0fc03918
JM
602 ast integer,
603 params integer,
604 env integer,
6a085103
JM
605 is_macro integer DEFAULT 0,
606 meta integer DEFAULT 1) RETURN integer IS
0fc03918
JM
607BEGIN
608 M.EXTEND();
2866f9a8 609 M(M.COUNT()) := mal_func_T(12, ast, params, env, is_macro, meta);
0fc03918
JM
610 RETURN M.COUNT();
611END;
612
06951f55
JM
613
614-- ---------------------------------------------------------
615-- atom functions
616
2866f9a8 617FUNCTION atom_new(M IN OUT NOCOPY mal_table,
0fc03918 618 val integer) RETURN integer IS
06951f55
JM
619 aidx integer;
620BEGIN
0fc03918 621 M.EXTEND();
2866f9a8 622 M(M.COUNT()) := mal_atom_T(13, val);
0fc03918 623 RETURN M.COUNT();
06951f55
JM
624END;
625
2866f9a8
JM
626FUNCTION atom_reset(M IN OUT NOCOPY mal_table,
627 atm integer,
628 val integer) RETURN integer IS
629BEGIN
630 M(atm) := mal_atom_T(13, val);
631 RETURN val;
632END;
633
634
06951f55 635
0fc03918 636END types;
7836cfa3
JM
637/
638show errors;