plsql (Oracle PL/SQL): Copy plpgsql. Step0,1 basics.
[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
7 FUNCTION pr_str(ast mal_type, print_readably boolean DEFAULT true)
8 RETURN varchar;
9END printer_pkg;
10/
11
12CREATE OR REPLACE PACKAGE BODY printer_pkg AS
13
14FUNCTION pr_str(ast mal_type, print_readably boolean DEFAULT true)
15 RETURN varchar IS
16 type_id integer;
17 first integer := 1;
18 i integer;
19 seq mal_seq_type;
20 str varchar2(4000);
21BEGIN
22 type_id := ast.type_id;
23 -- stream_writeline('pr_str type: ' || type_id);
24 CASE
25 WHEN type_id = 0 THEN RETURN 'nil';
26 WHEN type_id = 1 THEN RETURN 'false';
27 WHEN type_id = 2 THEN RETURN 'true';
28 WHEN type_id = 3 THEN -- integer
29 RETURN CAST(TREAT(ast AS mal_int_type).val_int as varchar);
30 WHEN type_id = 5 THEN -- string
31-- str := _valueToString(ast);
32-- IF chr(CAST(x'7f' AS integer)) = substring(str FROM 1 FOR 1) THEN
33-- RETURN ':' || substring(str FROM 2 FOR (char_length(str)-1));
34-- ELSIF print_readably THEN
35-- str := replace(str, E'\\', '\\');
36-- str := replace(str, '"', '\"');
37-- str := replace(str, E'\n', '\n');
38-- RETURN '"' || str || '"';
39-- ELSE
40-- RETURN str;
41-- END IF;
42 RETURN TREAT(ast AS mal_str_type).val_str;
43 WHEN type_id = 7 THEN -- symbol
44 RETURN TREAT(ast AS mal_str_type).val_str;
45 WHEN type_id = 8 THEN -- list
46 seq := TREAT(ast AS mal_seq_type);
47 str := '(';
48 FOR i IN 1..seq.val_seq.COUNT LOOP
49 IF first = 1 THEN
50 first := 0;
51 ELSE
52 str := str || ' ';
53 END IF;
54 str := str || pr_str(seq.val_seq(i));
55 END LOOP;
56 RETURN str || ')';
57-- WHEN type_id = 9 THEN -- vector
58-- BEGIN
59-- SELECT val_seq INTO seq FROM value WHERE value_id = ast;
60-- RETURN '[' ||
61-- array_to_string(array(
62-- SELECT pr_str(x, print_readably)
63-- FROM unnest(seq) AS x), ' ') ||
64-- ']';
65-- END;
66-- WHEN type_id = 10 THEN -- hash-map
67-- BEGIN
68-- SELECT val_hash INTO hash FROM value WHERE value_id = ast;
69-- RETURN '{' ||
70-- array_to_string(array(
71-- SELECT pr_str(CAST(key AS integer), print_readably) ||
72-- ' ' ||
73-- pr_str(CAST(value AS integer), print_readably)
74-- FROM each(hash)), ' ') ||
75-- '}';
76-- END;
77-- WHEN type_id = 11 THEN -- native function
78-- RETURN '#<function ' ||
79-- (SELECT val_string FROM value WHERE value_id = ast) ||
80-- '>';
81-- WHEN type_id = 12 THEN -- mal function
82-- BEGIN
83-- SELECT ast_id, params_id
84-- INTO vid, pid
85-- FROM value WHERE value_id = ast;
86-- RETURN '(fn* ' || pr_str(pid, print_readably) ||
87-- ' ' || pr_str(vid, print_readably) || ')';
88-- END;
89-- WHEN type_id = 13 THEN -- atom
90-- BEGIN
91-- SELECT val_seq[1] INTO vid
92-- FROM value WHERE value_id = ast;
93-- RETURN '(atom ' || pr_str(vid, print_readably) || ')';
94-- END;
95 ELSE
96 RETURN 'unknown';
97 END CASE;
98END;
99
100END printer_pkg;
101/
102show errors;
103
104PROMPT "printer finished";