Commit | Line | Data |
---|---|---|
97df14cd JM |
1 | -- --------------------------------------------------------- |
2 | -- printer.sql | |
3 | ||
4 | PROMPT "printer start"; | |
5 | ||
0fc03918 JM |
6 | CREATE OR REPLACE PACKAGE printer IS |
7 | FUNCTION pr_str_seq(M IN OUT NOCOPY mem_type, | |
8 | seq mal_seq_items_type, sep varchar2, | |
06951f55 | 9 | print_readably boolean DEFAULT TRUE) RETURN varchar; |
0fc03918 JM |
10 | FUNCTION pr_str(M IN OUT NOCOPY mem_type, |
11 | ast integer, | |
12 | print_readably boolean DEFAULT TRUE) RETURN varchar; | |
13 | END printer; | |
97df14cd JM |
14 | / |
15 | ||
0fc03918 | 16 | CREATE OR REPLACE PACKAGE BODY printer AS |
97df14cd | 17 | |
0fc03918 JM |
18 | FUNCTION pr_str_seq(M IN OUT NOCOPY mem_type, |
19 | seq mal_seq_items_type, sep varchar2, | |
06951f55 | 20 | print_readably boolean DEFAULT TRUE) RETURN varchar IS |
9fc524f1 JM |
21 | first integer := 1; |
22 | str varchar2(4000) := ''; | |
23 | BEGIN | |
24 | FOR i IN 1..seq.COUNT LOOP | |
25 | IF first = 1 THEN | |
26 | first := 0; | |
27 | ELSE | |
28 | str := str || sep; | |
29 | END IF; | |
0fc03918 | 30 | str := str || pr_str(M, seq(i), print_readably); |
9fc524f1 JM |
31 | END LOOP; |
32 | RETURN str; | |
33 | END; | |
34 | ||
0fc03918 JM |
35 | FUNCTION pr_str(M IN OUT NOCOPY mem_type, |
36 | ast integer, | |
06951f55 | 37 | print_readably boolean DEFAULT TRUE) RETURN varchar IS |
97df14cd JM |
38 | type_id integer; |
39 | first integer := 1; | |
40 | i integer; | |
97df14cd | 41 | str varchar2(4000); |
9fc524f1 | 42 | malfn malfunc_type; |
97df14cd | 43 | BEGIN |
0fc03918 | 44 | type_id := M(ast).type_id; |
97df14cd JM |
45 | -- stream_writeline('pr_str type: ' || type_id); |
46 | CASE | |
47 | WHEN type_id = 0 THEN RETURN 'nil'; | |
48 | WHEN type_id = 1 THEN RETURN 'false'; | |
49 | WHEN type_id = 2 THEN RETURN 'true'; | |
50 | WHEN type_id = 3 THEN -- integer | |
0fc03918 | 51 | RETURN CAST(TREAT(M(ast) AS mal_int_type).val_int as varchar); |
97df14cd | 52 | WHEN type_id = 5 THEN -- string |
0fc03918 | 53 | str := TREAT(M(ast) as mal_str_type).val_str; |
9fc524f1 JM |
54 | IF chr(127) = SUBSTR(str, 1, 1) THEN |
55 | RETURN ':' || SUBSTR(str, 2, LENGTH(str)-1); | |
56 | ELSIF print_readably THEN | |
57 | str := REPLACE(str, chr(92), '\\'); | |
58 | str := REPLACE(str, '"', '\"'); | |
59 | str := REPLACE(str, chr(10), '\n'); | |
60 | RETURN '"' || str || '"'; | |
61 | ELSE | |
62 | RETURN str; | |
63 | END IF; | |
0fc03918 | 64 | RETURN TREAT(M(ast) AS mal_str_type).val_str; |
97df14cd | 65 | WHEN type_id = 7 THEN -- symbol |
0fc03918 | 66 | RETURN TREAT(M(ast) AS mal_str_type).val_str; |
97df14cd | 67 | WHEN type_id = 8 THEN -- list |
0fc03918 JM |
68 | RETURN '(' || pr_str_seq(M, |
69 | TREAT(M(ast) AS mal_seq_type).val_seq, ' ', | |
9fc524f1 | 70 | print_readably) || ')'; |
97df14cd JM |
71 | -- WHEN type_id = 9 THEN -- vector |
72 | -- BEGIN | |
73 | -- SELECT val_seq INTO seq FROM value WHERE value_id = ast; | |
74 | -- RETURN '[' || | |
75 | -- array_to_string(array( | |
76 | -- SELECT pr_str(x, print_readably) | |
77 | -- FROM unnest(seq) AS x), ' ') || | |
78 | -- ']'; | |
79 | -- END; | |
80 | -- WHEN type_id = 10 THEN -- hash-map | |
81 | -- BEGIN | |
82 | -- SELECT val_hash INTO hash FROM value WHERE value_id = ast; | |
83 | -- RETURN '{' || | |
84 | -- array_to_string(array( | |
85 | -- SELECT pr_str(CAST(key AS integer), print_readably) || | |
86 | -- ' ' || | |
87 | -- pr_str(CAST(value AS integer), print_readably) | |
88 | -- FROM each(hash)), ' ') || | |
89 | -- '}'; | |
90 | -- END; | |
7836cfa3 JM |
91 | WHEN type_id = 11 THEN -- native function |
92 | RETURN '#<function ' || | |
0fc03918 | 93 | TREAT(M(ast) AS mal_str_type).val_str || |
7836cfa3 | 94 | '>'; |
9fc524f1 | 95 | WHEN type_id = 12 THEN -- mal function |
0fc03918 JM |
96 | malfn := TREAT(M(ast) AS malfunc_type); |
97 | RETURN '(fn* ' || pr_str(M, malfn.params, print_readably) || | |
98 | ' ' || pr_str(M, malfn.ast, print_readably) || ')'; | |
06951f55 | 99 | WHEN type_id = 13 THEN -- atom |
0fc03918 JM |
100 | RETURN '(atom ' || |
101 | pr_str(M, TREAT(M(ast) AS mal_atom_type).val, print_readably) || | |
102 | ')'; | |
97df14cd JM |
103 | ELSE |
104 | RETURN 'unknown'; | |
105 | END CASE; | |
106 | END; | |
107 | ||
0fc03918 | 108 | END printer; |
97df14cd JM |
109 | / |
110 | show errors; | |
111 | ||
112 | PROMPT "printer finished"; |