Commit | Line | Data |
---|---|---|
97df14cd JM |
1 | -- --------------------------------------------------------- |
2 | -- printer.sql | |
3 | ||
4 | PROMPT "printer start"; | |
5 | ||
6 | CREATE 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 |
11 | END printer_pkg; |
12 | / | |
13 | ||
14 | CREATE OR REPLACE PACKAGE BODY printer_pkg AS | |
15 | ||
9fc524f1 | 16 | FUNCTION 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) := ''; | |
20 | BEGIN | |
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; | |
30 | END; | |
31 | ||
32 | FUNCTION 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 |
39 | BEGIN |
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; | |
99 | END; | |
100 | ||
101 | END printer_pkg; | |
102 | / | |
103 | show errors; | |
104 | ||
105 | PROMPT "printer finished"; |