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