Commit | Line | Data |
---|---|---|
9fc524f1 JM |
1 | PROMPT 'core.sql start'; |
2 | ||
3 | CREATE OR REPLACE TYPE core_ns_type IS TABLE OF varchar2(100); | |
4 | / | |
5 | ||
6 | ||
7 | CREATE OR REPLACE PACKAGE core_pkg IS | |
8 | ||
9 | FUNCTION do_core_func(fn mal_type, args mal_seq_items_type) RETURN mal_type; | |
10 | ||
11 | FUNCTION get_core_ns RETURN core_ns_type; | |
12 | ||
13 | END core_pkg; | |
14 | / | |
15 | ||
16 | ||
17 | CREATE OR REPLACE PACKAGE BODY core_pkg AS | |
18 | ||
19 | -- general functions | |
20 | FUNCTION equal_Q(args mal_seq_items_type) RETURN mal_type IS | |
21 | BEGIN | |
22 | RETURN types_pkg.wraptf(types_pkg.equal_Q(args(1), args(2))); | |
23 | END; | |
24 | ||
25 | -- string functions | |
26 | FUNCTION pr_str(args mal_seq_items_type) RETURN mal_type IS | |
27 | BEGIN | |
28 | RETURN mal_str_type(5, printer_pkg.pr_str_seq(args, ' ', TRUE)); | |
29 | END; | |
30 | ||
31 | FUNCTION str(args mal_seq_items_type) RETURN mal_type IS | |
32 | BEGIN | |
33 | RETURN mal_str_type(5, printer_pkg.pr_str_seq(args, '', FALSE)); | |
34 | END; | |
35 | ||
36 | FUNCTION prn(args mal_seq_items_type) RETURN mal_type IS | |
37 | BEGIN | |
38 | stream_writeline(printer_pkg.pr_str_seq(args, ' ', TRUE)); | |
39 | RETURN mal_type(0); | |
40 | END; | |
41 | ||
42 | FUNCTION println(args mal_seq_items_type) RETURN mal_type IS | |
43 | BEGIN | |
44 | stream_writeline(printer_pkg.pr_str_seq(args, ' ', FALSE)); | |
45 | RETURN mal_type(0); | |
46 | END; | |
47 | ||
48 | ||
49 | -- numeric functions | |
50 | FUNCTION lt(args mal_seq_items_type) RETURN mal_type IS | |
51 | BEGIN | |
52 | RETURN types_pkg.wraptf(TREAT(args(1) AS mal_int_type).val_int < | |
53 | TREAT(args(2) AS mal_int_type).val_int); | |
54 | END; | |
55 | ||
56 | FUNCTION lte(args mal_seq_items_type) RETURN mal_type IS | |
57 | BEGIN | |
58 | RETURN types_pkg.wraptf(TREAT(args(1) AS mal_int_type).val_int <= | |
59 | TREAT(args(2) AS mal_int_type).val_int); | |
60 | END; | |
61 | ||
62 | FUNCTION gt(args mal_seq_items_type) RETURN mal_type IS | |
63 | BEGIN | |
64 | RETURN types_pkg.wraptf(TREAT(args(1) AS mal_int_type).val_int > | |
65 | TREAT(args(2) AS mal_int_type).val_int); | |
66 | END; | |
67 | ||
68 | FUNCTION gte(args mal_seq_items_type) RETURN mal_type IS | |
69 | BEGIN | |
70 | RETURN types_pkg.wraptf(TREAT(args(1) AS mal_int_type).val_int >= | |
71 | TREAT(args(2) AS mal_int_type).val_int); | |
72 | END; | |
73 | ||
74 | FUNCTION add(args mal_seq_items_type) RETURN mal_type IS | |
75 | BEGIN | |
76 | RETURN mal_int_type(3, TREAT(args(1) AS mal_int_type).val_int + | |
77 | TREAT(args(2) AS mal_int_type).val_int); | |
78 | END; | |
79 | ||
80 | FUNCTION subtract(args mal_seq_items_type) RETURN mal_type IS | |
81 | BEGIN | |
82 | RETURN mal_int_type(3, TREAT(args(1) AS mal_int_type).val_int - | |
83 | TREAT(args(2) AS mal_int_type).val_int); | |
84 | END; | |
85 | ||
86 | FUNCTION multiply(args mal_seq_items_type) RETURN mal_type IS | |
87 | BEGIN | |
88 | RETURN mal_int_type(3, TREAT(args(1) AS mal_int_type).val_int * | |
89 | TREAT(args(2) AS mal_int_type).val_int); | |
90 | END; | |
91 | ||
92 | FUNCTION divide(args mal_seq_items_type) RETURN mal_type IS | |
93 | BEGIN | |
94 | RETURN mal_int_type(3, TREAT(args(1) AS mal_int_type).val_int / | |
95 | TREAT(args(2) AS mal_int_type).val_int); | |
96 | END; | |
97 | ||
98 | -- general native function case/switch | |
99 | FUNCTION do_core_func(fn mal_type, args mal_seq_items_type) RETURN mal_type IS | |
100 | fname varchar(100); | |
101 | BEGIN | |
102 | IF fn.type_id <> 11 THEN | |
103 | raise_application_error(-20004, | |
104 | 'Invalid function call', TRUE); | |
105 | END IF; | |
106 | ||
107 | fname := TREAT(fn AS mal_str_type).val_str; | |
108 | ||
109 | CASE | |
110 | WHEN fname = '=' THEN RETURN equal_Q(args); | |
111 | ||
112 | WHEN fname = 'pr-str' THEN RETURN pr_str(args); | |
113 | WHEN fname = 'str' THEN RETURN str(args); | |
114 | WHEN fname = 'prn' THEN RETURN prn(args); | |
115 | WHEN fname = 'println' THEN RETURN println(args); | |
116 | ||
117 | WHEN fname = '<' THEN RETURN lt(args); | |
118 | WHEN fname = '<=' THEN RETURN lte(args); | |
119 | WHEN fname = '>' THEN RETURN gt(args); | |
120 | WHEN fname = '>=' THEN RETURN gte(args); | |
121 | WHEN fname = '+' THEN RETURN add(args); | |
122 | WHEN fname = '-' THEN RETURN subtract(args); | |
123 | WHEN fname = '*' THEN RETURN multiply(args); | |
124 | WHEN fname = '/' THEN RETURN divide(args); | |
125 | ||
126 | WHEN fname = 'list' THEN RETURN types_pkg.list(args); | |
127 | WHEN fname = 'list?' THEN RETURN types_pkg.wraptf(args(1).type_id = 8); | |
128 | ||
129 | WHEN fname = 'empty?' THEN | |
130 | RETURN types_pkg.wraptf(0 = types_pkg.count(args(1))); | |
131 | WHEN fname = 'count' THEN | |
132 | IF args(1).type_id = 0 THEN | |
133 | RETURN mal_int_type(3, 0); | |
134 | ELSE | |
135 | RETURN mal_int_type(3, types_pkg.count(args(1))); | |
136 | END IF; | |
137 | ||
138 | ELSE raise_application_error(-20004, | |
139 | 'Invalid function call', TRUE); | |
140 | END CASE; | |
141 | END; | |
142 | ||
143 | FUNCTION get_core_ns RETURN core_ns_type IS | |
144 | BEGIN | |
145 | RETURN core_ns_type( | |
146 | '=', | |
147 | ||
148 | 'pr-str', | |
149 | 'str', | |
150 | 'prn', | |
151 | 'println', | |
152 | ||
153 | '<', | |
154 | '<=', | |
155 | '>', | |
156 | '>=', | |
157 | '+', | |
158 | '-', | |
159 | '*', | |
160 | '/', | |
161 | ||
162 | 'list', | |
163 | 'list?', | |
164 | ||
165 | 'empty?', | |
166 | 'count'); | |
167 | END; | |
168 | ||
169 | END core_pkg; | |
170 | / | |
171 | show errors; | |
172 | ||
173 | PROMPT 'core.sql finished'; |