Merge pull request #406 from chr15m/lib-alias-hacks
[jackhill/mal.git] / plsql / printer.sql
CommitLineData
97df14cd
JM
1-- ---------------------------------------------------------
2-- printer.sql
3
0fc03918 4CREATE OR REPLACE PACKAGE printer IS
2866f9a8 5 FUNCTION pr_str_seq(M IN OUT NOCOPY types.mal_table,
6a085103 6 H IN OUT NOCOPY types.map_entry_table,
2866f9a8 7 seq mal_vals, sep varchar2,
06951f55 8 print_readably boolean DEFAULT TRUE) RETURN varchar;
2866f9a8 9 FUNCTION pr_str(M IN OUT NOCOPY types.mal_table,
6a085103 10 H IN OUT NOCOPY types.map_entry_table,
0fc03918
JM
11 ast integer,
12 print_readably boolean DEFAULT TRUE) RETURN varchar;
13END printer;
97df14cd 14/
2866f9a8 15show errors;
97df14cd 16
0fc03918 17CREATE OR REPLACE PACKAGE BODY printer AS
97df14cd 18
2866f9a8 19FUNCTION pr_str_seq(M IN OUT NOCOPY types.mal_table,
6a085103 20 H IN OUT NOCOPY types.map_entry_table,
2866f9a8 21 seq mal_vals, sep varchar2,
06951f55 22 print_readably boolean DEFAULT TRUE) RETURN varchar IS
9fc524f1 23 first integer := 1;
02936b42 24 str CLOB;
9fc524f1
JM
25BEGIN
26 FOR i IN 1..seq.COUNT LOOP
27 IF first = 1 THEN
28 first := 0;
29 ELSE
30 str := str || sep;
31 END IF;
6a085103 32 str := str || pr_str(M, H, seq(i), print_readably);
9fc524f1
JM
33 END LOOP;
34 RETURN str;
35END;
36
2866f9a8 37FUNCTION pr_str_map(M IN OUT NOCOPY types.mal_table,
6a085103
JM
38 H IN OUT NOCOPY types.map_entry_table,
39 midx integer, sep varchar2,
40 print_readably boolean DEFAULT TRUE) RETURN varchar IS
41 key varchar2(256);
42 first integer := 1;
02936b42 43 str CLOB;
6a085103
JM
44BEGIN
45 key := H(midx).FIRST();
46 WHILE key IS NOT NULL LOOP
47 IF first = 1 THEN
48 first := 0;
49 ELSE
50 str := str || sep;
51 END IF;
52 str := str || pr_str(M, H, types.string(M, key), print_readably);
53 str := str || ' ' || pr_str(M, H, H(midx)(key), print_readably);
54 key := H(midx).NEXT(key);
55 END LOOP;
56 RETURN str;
57END;
58
59
2866f9a8 60FUNCTION pr_str(M IN OUT NOCOPY types.mal_table,
6a085103 61 H IN OUT NOCOPY types.map_entry_table,
0fc03918 62 ast integer,
06951f55 63 print_readably boolean DEFAULT TRUE) RETURN varchar IS
97df14cd
JM
64 type_id integer;
65 first integer := 1;
66 i integer;
02936b42 67 str CLOB;
2866f9a8 68 malfn mal_func_T;
97df14cd 69BEGIN
0fc03918 70 type_id := M(ast).type_id;
2866f9a8 71 -- io.writeline('pr_str type: ' || type_id);
97df14cd
JM
72 CASE
73 WHEN type_id = 0 THEN RETURN 'nil';
74 WHEN type_id = 1 THEN RETURN 'false';
75 WHEN type_id = 2 THEN RETURN 'true';
76 WHEN type_id = 3 THEN -- integer
2866f9a8 77 RETURN CAST(TREAT(M(ast) AS mal_int_T).val_int as varchar);
02936b42
JM
78 WHEN type_id IN (5,6) THEN -- string
79 IF type_id = 5 THEN
2866f9a8 80 str := TREAT(M(ast) as mal_str_T).val_str;
02936b42 81 ELSE
2866f9a8 82 str := TREAT(M(ast) as mal_long_str_T).val_long_str;
02936b42 83 END IF;
9fc524f1
JM
84 IF chr(127) = SUBSTR(str, 1, 1) THEN
85 RETURN ':' || SUBSTR(str, 2, LENGTH(str)-1);
86 ELSIF print_readably THEN
87 str := REPLACE(str, chr(92), '\\');
88 str := REPLACE(str, '"', '\"');
89 str := REPLACE(str, chr(10), '\n');
90 RETURN '"' || str || '"';
91 ELSE
92 RETURN str;
93 END IF;
2866f9a8 94 RETURN TREAT(M(ast) AS mal_str_T).val_str;
97df14cd 95 WHEN type_id = 7 THEN -- symbol
2866f9a8 96 RETURN TREAT(M(ast) AS mal_str_T).val_str;
97df14cd 97 WHEN type_id = 8 THEN -- list
6a085103 98 RETURN '(' || pr_str_seq(M, H,
2866f9a8 99 TREAT(M(ast) AS mal_seq_T).val_seq, ' ',
9fc524f1 100 print_readably) || ')';
6a085103
JM
101 WHEN type_id = 9 THEN -- vector
102 RETURN '[' || pr_str_seq(M, H,
2866f9a8 103 TREAT(M(ast) AS mal_seq_T).val_seq, ' ',
6a085103
JM
104 print_readably) || ']';
105 WHEN type_id = 10 THEN -- hash-map
106 RETURN '{' || pr_str_map(M, H,
2866f9a8 107 TREAT(M(ast) AS mal_map_T).map_idx, ' ',
6a085103 108 print_readably) || '}';
7836cfa3
JM
109 WHEN type_id = 11 THEN -- native function
110 RETURN '#<function ' ||
2866f9a8 111 TREAT(M(ast) AS mal_str_T).val_str ||
7836cfa3 112 '>';
9fc524f1 113 WHEN type_id = 12 THEN -- mal function
2866f9a8 114 malfn := TREAT(M(ast) AS mal_func_T);
6a085103
JM
115 RETURN '(fn* ' || pr_str(M, H, malfn.params, print_readably) ||
116 ' ' || pr_str(M, H, malfn.ast, print_readably) || ')';
06951f55 117 WHEN type_id = 13 THEN -- atom
0fc03918 118 RETURN '(atom ' ||
2866f9a8 119 pr_str(M, H, TREAT(M(ast) AS mal_atom_T).val, print_readably) ||
0fc03918 120 ')';
97df14cd
JM
121 ELSE
122 RETURN 'unknown';
123 END CASE;
124END;
125
0fc03918 126END printer;
97df14cd
JM
127/
128show errors;