plsql: refactor with memory pool. step5,7,8 basics.
[jackhill/mal.git] / plsql / printer.sql
CommitLineData
97df14cd
JM
1-- ---------------------------------------------------------
2-- printer.sql
3
4PROMPT "printer start";
5
0fc03918
JM
6CREATE OR REPLACE PACKAGE printer IS
7 FUNCTION pr_str_seq(M IN OUT NOCOPY mem_type,
8 seq mal_seq_items_type, sep varchar2,
06951f55 9 print_readably boolean DEFAULT TRUE) RETURN varchar;
0fc03918
JM
10 FUNCTION pr_str(M IN OUT NOCOPY mem_type,
11 ast integer,
12 print_readably boolean DEFAULT TRUE) RETURN varchar;
13END printer;
97df14cd
JM
14/
15
0fc03918 16CREATE OR REPLACE PACKAGE BODY printer AS
97df14cd 17
0fc03918
JM
18FUNCTION pr_str_seq(M IN OUT NOCOPY mem_type,
19 seq mal_seq_items_type, sep varchar2,
06951f55 20 print_readably boolean DEFAULT TRUE) RETURN varchar IS
9fc524f1
JM
21 first integer := 1;
22 str varchar2(4000) := '';
23BEGIN
24 FOR i IN 1..seq.COUNT LOOP
25 IF first = 1 THEN
26 first := 0;
27 ELSE
28 str := str || sep;
29 END IF;
0fc03918 30 str := str || pr_str(M, seq(i), print_readably);
9fc524f1
JM
31 END LOOP;
32 RETURN str;
33END;
34
0fc03918
JM
35FUNCTION pr_str(M IN OUT NOCOPY mem_type,
36 ast integer,
06951f55 37 print_readably boolean DEFAULT TRUE) RETURN varchar IS
97df14cd
JM
38 type_id integer;
39 first integer := 1;
40 i integer;
97df14cd 41 str varchar2(4000);
9fc524f1 42 malfn malfunc_type;
97df14cd 43BEGIN
0fc03918 44 type_id := M(ast).type_id;
97df14cd
JM
45 -- stream_writeline('pr_str type: ' || type_id);
46 CASE
47 WHEN type_id = 0 THEN RETURN 'nil';
48 WHEN type_id = 1 THEN RETURN 'false';
49 WHEN type_id = 2 THEN RETURN 'true';
50 WHEN type_id = 3 THEN -- integer
0fc03918 51 RETURN CAST(TREAT(M(ast) AS mal_int_type).val_int as varchar);
97df14cd 52 WHEN type_id = 5 THEN -- string
0fc03918 53 str := TREAT(M(ast) as mal_str_type).val_str;
9fc524f1
JM
54 IF chr(127) = SUBSTR(str, 1, 1) THEN
55 RETURN ':' || SUBSTR(str, 2, LENGTH(str)-1);
56 ELSIF print_readably THEN
57 str := REPLACE(str, chr(92), '\\');
58 str := REPLACE(str, '"', '\"');
59 str := REPLACE(str, chr(10), '\n');
60 RETURN '"' || str || '"';
61 ELSE
62 RETURN str;
63 END IF;
0fc03918 64 RETURN TREAT(M(ast) AS mal_str_type).val_str;
97df14cd 65 WHEN type_id = 7 THEN -- symbol
0fc03918 66 RETURN TREAT(M(ast) AS mal_str_type).val_str;
97df14cd 67 WHEN type_id = 8 THEN -- list
0fc03918
JM
68 RETURN '(' || pr_str_seq(M,
69 TREAT(M(ast) AS mal_seq_type).val_seq, ' ',
9fc524f1 70 print_readably) || ')';
97df14cd
JM
71-- WHEN type_id = 9 THEN -- vector
72-- BEGIN
73-- SELECT val_seq INTO seq FROM value WHERE value_id = ast;
74-- RETURN '[' ||
75-- array_to_string(array(
76-- SELECT pr_str(x, print_readably)
77-- FROM unnest(seq) AS x), ' ') ||
78-- ']';
79-- END;
80-- WHEN type_id = 10 THEN -- hash-map
81-- BEGIN
82-- SELECT val_hash INTO hash FROM value WHERE value_id = ast;
83-- RETURN '{' ||
84-- array_to_string(array(
85-- SELECT pr_str(CAST(key AS integer), print_readably) ||
86-- ' ' ||
87-- pr_str(CAST(value AS integer), print_readably)
88-- FROM each(hash)), ' ') ||
89-- '}';
90-- END;
7836cfa3
JM
91 WHEN type_id = 11 THEN -- native function
92 RETURN '#<function ' ||
0fc03918 93 TREAT(M(ast) AS mal_str_type).val_str ||
7836cfa3 94 '>';
9fc524f1 95 WHEN type_id = 12 THEN -- mal function
0fc03918
JM
96 malfn := TREAT(M(ast) AS malfunc_type);
97 RETURN '(fn* ' || pr_str(M, malfn.params, print_readably) ||
98 ' ' || pr_str(M, malfn.ast, print_readably) || ')';
06951f55 99 WHEN type_id = 13 THEN -- atom
0fc03918
JM
100 RETURN '(atom ' ||
101 pr_str(M, TREAT(M(ast) AS mal_atom_type).val, print_readably) ||
102 ')';
97df14cd
JM
103 ELSE
104 RETURN 'unknown';
105 END CASE;
106END;
107
0fc03918 108END printer;
97df14cd
JM
109/
110show errors;
111
112PROMPT "printer finished";