1 -- ---------------------------------------------------------
5 pr_str_array(arr
integer[], sep
varchar, print_readably
boolean)
11 IF array_length(arr
, 1) > 0 THEN
12 FOR i
IN array_lower(arr
, 1) ..
array_upper(arr
, 1)
14 res
:= array_append(res
, pr_str(arr
[i
], print_readably
));
16 RETURN array_to_string(res
, sep
);
20 END; $$
LANGUAGE plpgsql
;
23 pr_str(ast
integer, print_readably
boolean DEFAULT true)
26 re
varchar = E
'[[:space:] ,]*(~@|[\\[\\]{}()\'`~@]|"(?:[\\\\].|[^\\\\"])*"|;.*|[^\\s \\[\\]{}()\'"`~@,;]*)';
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;
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
'7f' 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 ||
'"';
57 WHEN type = 7 THEN -- symbol
58 RETURN _valueToString(ast
);
59 WHEN type = 8 THEN -- list
61 SELECT val_seq
INTO seq
FROM value WHERE value_id
= ast
;
63 array_to_string(array(
64 SELECT pr_str(x
, print_readably
)
65 FROM unnest(seq
) AS x
), ' ') ||
68 WHEN type = 9 THEN -- vector
70 SELECT val_seq
INTO seq
FROM value WHERE value_id
= ast
;
72 array_to_string(array(
73 SELECT pr_str(x
, print_readably
)
74 FROM unnest(seq
) AS x
), ' ') ||
77 WHEN type = 10 THEN -- hash-map
79 SELECT val_hash
INTO hash
FROM value WHERE value_id
= ast
;
81 array_to_string(array(
82 SELECT pr_str(CAST(key AS integer), print_readably
) ||
84 pr_str(CAST(value AS integer), print_readably
)
85 FROM each(hash
)), ' ') ||
88 WHEN type = 11 THEN -- native function
89 RETURN '#<function ' ||
90 (SELECT val_string
FROM value WHERE value_id
= ast
) ||
92 WHEN type = 12 THEN -- mal function
94 SELECT ast_id
, params_id
96 FROM value WHERE value_id
= ast
;
97 RETURN '(fn* ' ||
pr_str(pid
, print_readably
) ||
98 ' ' ||
pr_str(vid
, print_readably
) ||
')';
100 WHEN type = 13 THEN -- atom
102 SELECT val_seq
[1] INTO vid
103 FROM value WHERE value_id
= ast
;
104 RETURN '(atom ' ||
pr_str(vid
, print_readably
) ||
')';
109 END; $$
LANGUAGE plpgsql
;