plpgsql: remove type table. Fix slurp.
[jackhill/mal.git] / plpgsql / printer.sql
1 -- ---------------------------------------------------------
2 -- printer.sql
3
4 CREATE FUNCTION
5 pr_str_array(arr integer[], sep varchar, print_readably boolean)
6 RETURNS varchar AS $$
7 DECLARE
8 i integer;
9 res varchar[];
10 BEGIN
11 IF array_length(arr, 1) > 0 THEN
12 FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
13 LOOP
14 res := array_append(res, pr_str(arr[i], print_readably));
15 END LOOP;
16 RETURN array_to_string(res, sep);
17 ELSE
18 RETURN '';
19 END IF;
20 END; $$ LANGUAGE plpgsql;
21
22 CREATE FUNCTION
23 pr_str(ast integer, print_readably boolean DEFAULT true)
24 RETURNS varchar AS $$
25 DECLARE
26 re varchar = E'[[:space:] ,]*(~@|[\\[\\]{}()\'`~@]|"(?:[\\\\].|[^\\\\"])*"|;.*|[^\\s \\[\\]{}()\'"`~@,;]*)';
27 type integer;
28 seq integer[];
29 hash hstore;
30 cid integer;
31 vid integer;
32 pid integer;
33 str varchar;
34 BEGIN
35 -- RAISE NOTICE 'pr_str ast: %', ast;
36 SELECT type_id FROM value WHERE value_id = ast INTO type;
37 -- RAISE NOTICE 'pr_str type: %', type;
38 CASE
39 WHEN type = 0 THEN RETURN 'nil';
40 WHEN type = 1 THEN RETURN 'false';
41 WHEN type = 2 THEN RETURN 'true';
42 WHEN type = 3 THEN -- integer
43 RETURN CAST((SELECT val_int
44 FROM value WHERE value_id = ast) as varchar);
45 WHEN type = 5 THEN -- string
46 str := _valueToString(ast);
47 IF chr(CAST(x'29e' AS integer)) = substring(str FROM 1 FOR 1) THEN
48 RETURN ':' || substring(str FROM 2 FOR (char_length(str)-1));
49 ELSIF print_readably THEN
50 str := replace(str, E'\\', '\\');
51 str := replace(str, '"', '\"');
52 str := replace(str, E'\n', '\n');
53 RETURN '"' || str || '"';
54 ELSE
55 RETURN str;
56 END IF;
57 WHEN type = 7 THEN -- symbol
58 RETURN _valueToString(ast);
59 WHEN type = 8 THEN -- list
60 BEGIN
61 SELECT val_seq INTO seq FROM value WHERE value_id = ast;
62 RETURN '(' ||
63 array_to_string(array(
64 SELECT pr_str(x, print_readably)
65 FROM unnest(seq) AS x), ' ') ||
66 ')';
67 END;
68 WHEN type = 9 THEN -- vector
69 BEGIN
70 SELECT val_seq INTO seq FROM value WHERE value_id = ast;
71 RETURN '[' ||
72 array_to_string(array(
73 SELECT pr_str(x, print_readably)
74 FROM unnest(seq) AS x), ' ') ||
75 ']';
76 END;
77 WHEN type = 10 THEN -- hash-map
78 BEGIN
79 SELECT val_hash INTO hash FROM value WHERE value_id = ast;
80 RETURN '{' ||
81 array_to_string(array(
82 SELECT pr_str(CAST(key AS integer), print_readably) ||
83 ' ' ||
84 pr_str(CAST(value AS integer), print_readably)
85 FROM each(hash)), ' ') ||
86 '}';
87 END;
88 WHEN type = 11 THEN -- native function
89 RETURN '#<function ' ||
90 (SELECT val_string FROM value WHERE value_id = ast) ||
91 '>';
92 WHEN type = 12 THEN -- mal function
93 BEGIN
94 SELECT ast_id, params_id
95 INTO vid, pid
96 FROM value WHERE value_id = ast;
97 RETURN '(fn* ' || pr_str(pid, print_readably) ||
98 ' ' || pr_str(vid, print_readably) || ')';
99 END;
100 WHEN type = 13 THEN -- atom
101 BEGIN
102 SELECT val_seq[1] INTO vid
103 FROM value WHERE value_id = ast;
104 RETURN '(atom ' || pr_str(vid, print_readably) || ')';
105 END;
106 ELSE
107 RETURN 'unknown';
108 END CASE;
109 END; $$ LANGUAGE plpgsql;