1 -- ---------------------------------------------------------
4 CREATE OR REPLACE PACKAGE printer
IS
5 FUNCTION pr_str_seq(M
IN OUT NOCOPY types.mal_table
,
6 H
IN OUT NOCOPY types.map_entry_table
,
7 seq mal_vals
, sep
varchar2,
8 print_readably
boolean DEFAULT TRUE) RETURN varchar;
9 FUNCTION pr_str(M
IN OUT NOCOPY types.mal_table
,
10 H
IN OUT NOCOPY types.map_entry_table
,
12 print_readably
boolean DEFAULT TRUE) RETURN varchar;
17 CREATE OR REPLACE PACKAGE BODY printer
AS
19 FUNCTION pr_str_seq(M
IN OUT NOCOPY types.mal_table
,
20 H
IN OUT NOCOPY types.map_entry_table
,
21 seq mal_vals
, sep
varchar2,
22 print_readably
boolean DEFAULT TRUE) RETURN varchar IS
26 FOR i
IN 1..seq.
COUNT LOOP
32 str
:= str ||
pr_str(M
, H
, seq(i
), print_readably
);
37 FUNCTION pr_str_map(M
IN OUT NOCOPY types.mal_table
,
38 H
IN OUT NOCOPY types.map_entry_table
,
39 midx
integer, sep
varchar2,
40 print_readably
boolean DEFAULT TRUE) RETURN varchar IS
45 key := H(midx
).
FIRST();
46 WHILE
key IS NOT NULL LOOP
52 str
:= str ||
pr_str(M
, H
, types.
string(M
, key), print_readably
);
53 str
:= str ||
' ' ||
pr_str(M
, H
, H(midx
)(key), print_readably
);
54 key := H(midx
).
NEXT(key);
60 FUNCTION pr_str(M
IN OUT NOCOPY types.mal_table
,
61 H
IN OUT NOCOPY types.map_entry_table
,
63 print_readably
boolean DEFAULT TRUE) RETURN varchar IS
70 type_id
:= M(ast
).type_id
;
71 -- io.writeline('pr_str type: ' || type_id);
73 WHEN type_id
= 0 THEN RETURN 'nil';
74 WHEN type_id
= 1 THEN RETURN 'false';
75 WHEN type_id
= 2 THEN RETURN 'true';
76 WHEN type_id
= 3 THEN -- integer
77 RETURN CAST(TREAT(M(ast
) AS mal_int_T
).val_int
as varchar);
78 WHEN type_id
IN (5,6) THEN -- string
80 str
:= TREAT(M(ast
) as mal_str_T
).val_str
;
82 str
:= TREAT(M(ast
) as mal_long_str_T
).val_long_str
;
84 IF chr(127) = SUBSTR(str
, 1, 1) THEN
85 RETURN ':' ||
SUBSTR(str
, 2, LENGTH(str
)-1);
86 ELSIF print_readably
THEN
87 str
:= REPLACE(str
, chr(92), '\\');
88 str
:= REPLACE(str
, '"', '\"');
89 str
:= REPLACE(str
, chr(10), '\n');
90 RETURN '"' || str ||
'"';
94 RETURN TREAT(M(ast
) AS mal_str_T
).val_str
;
95 WHEN type_id
= 7 THEN -- symbol
96 RETURN TREAT(M(ast
) AS mal_str_T
).val_str
;
97 WHEN type_id
= 8 THEN -- list
98 RETURN '(' ||
pr_str_seq(M
, H
,
99 TREAT(M(ast
) AS mal_seq_T
).val_seq
, ' ',
100 print_readably
) ||
')';
101 WHEN type_id
= 9 THEN -- vector
102 RETURN '[' ||
pr_str_seq(M
, H
,
103 TREAT(M(ast
) AS mal_seq_T
).val_seq
, ' ',
104 print_readably
) ||
']';
105 WHEN type_id
= 10 THEN -- hash-map
106 RETURN '{' ||
pr_str_map(M
, H
,
107 TREAT(M(ast
) AS mal_map_T
).map_idx
, ' ',
108 print_readably
) ||
'}';
109 WHEN type_id
= 11 THEN -- native function
110 RETURN '#<function ' ||
111 TREAT(M(ast
) AS mal_str_T
).val_str ||
113 WHEN type_id
= 12 THEN -- mal function
114 malfn
:= TREAT(M(ast
) AS mal_func_T
);
115 RETURN '(fn* ' ||
pr_str(M
, H
, malfn.params
, print_readably
) ||
116 ' ' ||
pr_str(M
, H
, malfn.ast
, print_readably
) ||
')';
117 WHEN type_id
= 13 THEN -- atom
119 pr_str(M
, H
, TREAT(M(ast
) AS mal_atom_T
).val
, print_readably
) ||