Commit | Line | Data |
---|---|---|
97df14cd JM |
1 | -- --------------------------------------------------------- |
2 | -- printer.sql | |
3 | ||
4 | PROMPT "printer start"; | |
5 | ||
6 | CREATE OR REPLACE PACKAGE printer_pkg IS | |
7 | FUNCTION pr_str(ast mal_type, print_readably boolean DEFAULT true) | |
8 | RETURN varchar; | |
9 | END printer_pkg; | |
10 | / | |
11 | ||
12 | CREATE OR REPLACE PACKAGE BODY printer_pkg AS | |
13 | ||
14 | FUNCTION 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); | |
21 | BEGIN | |
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; | |
98 | END; | |
99 | ||
100 | END printer_pkg; | |
101 | / | |
102 | show errors; | |
103 | ||
104 | PROMPT "printer finished"; |