DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / rexx / types.rexx
CommitLineData
33a37291
DM
1#ifndef __types__
2#define __types__
3
4values. = ""
5values.0 = 0
6
7new_value_index: procedure expose values. /* new_value_index() */
8 values.0 = values.0 + 1
9 return values.0
10
11obj_type: procedure /* obj_type(obj) */
12 obj = arg(1)
13 return left(obj, 4)
14
15obj_val: procedure expose values. /* obj_val(obj) */
16 obj = arg(1)
17 type = obj_type(obj)
18 val = substr(obj, 6)
19 select
20 when type == "numb" | type == "nill" | type == "true" | type == "fals" then return val
21 otherwise
22 return values.val
23 end
24
25obj_meta: procedure expose values. /* obj_meta(obj) */
26 obj = arg(1)
27 type = obj_type(obj)
28 if type == "numb" | type == "nill" | type == "true" | type == "fals" then return ""
29 ind = substr(obj, 6)
30 return values.meta.ind
31
32obj_clone_and_set_meta: procedure expose values. /* obj_clone_and_set_meta(obj, new_meta) */
33 obj = arg(1)
34 new_meta = arg(2)
35 type = obj_type(obj)
36 if type == "numb" | type == "nill" | type == "true" | type == "fals" then return ""
37 orig_ind = substr(obj, 6)
38 new_idx = new_value_index()
39 values.new_idx = values.orig_ind
40 values.meta.new_idx = new_meta
41 return type || "_" || new_idx
42
43new_number: procedure /* new_number(n) */
44 n = arg(1)
45 return "numb_" || n
46
7cecb87a
DM
47number?: procedure /* number?(obj) */
48 return obj_type(arg(1)) == "numb"
49
33a37291
DM
50new_nil: procedure /* new_nil() */
51 return "nill_0"
52
53nil?: procedure /* nil?(obj) */
54 return obj_type(arg(1)) == "nill"
55
56new_true: procedure /* new_true() */
57 return "true_0"
58
59true?: procedure /* true?(obj) */
60 return obj_type(arg(1)) == "true"
61
62new_false: procedure /* new_false() */
63 return "fals_0"
64
65false?: procedure /* false?(obj) */
66 return obj_type(arg(1)) == "fals"
67
68new_boolean: procedure /* new_boolean(cond) */
69 if arg(1) then
70 return new_true()
71 else
72 return new_false()
73
74new_symbol: procedure expose values. /* new_symbol(str) */
75 str = arg(1)
76 idx = new_value_index()
77 values.idx = str
78 return "symb_" || idx
79
80symbol?: procedure /* symbol?(obj) */
81 return obj_type(arg(1)) == "symb"
82
83new_string: procedure expose values. /* new_string(str) */
84 str = arg(1)
85 idx = new_value_index()
86 values.idx = str
87 return "stri_" || idx
88
89string?: procedure /* string?(obj) */
90 return obj_type(arg(1)) == "stri"
91
92new_keyword: procedure expose values. /* new_keyword(str) */
93 str = arg(1)
94 idx = new_value_index()
95 values.idx = str
96 return "keyw_" || idx
97
98keyword?: procedure /* keyword?(obj) */
99 return obj_type(arg(1)) == "keyw"
100
101new_seq: procedure expose values. /* new_seq(type, seq) */
102 type = arg(1)
103 seq = arg(2)
104 idx = new_value_index()
105 values.idx = seq
106 return type || "_" || idx
107
108new_list: procedure expose values. /* new_list(seq) */
109 seq = arg(1)
110 return new_seq("list", seq)
111
112list?: procedure /* list?(obj) */
113 return obj_type(arg(1)) == "list"
114
115new_vector: procedure expose values. /* new_vector(seq) */
116 seq = arg(1)
117 return new_seq("vect", seq)
118
119vector?: procedure /* vector?(obj) */
120 return obj_type(arg(1)) == "vect"
121
122sequential?: procedure /* sequential?(obj) */
123 return (list?(arg(1)) | vector?(arg(1)))
124
125count_elements: procedure expose values. /* count_elements(lst) */
126 return words(obj_val(arg(1)))
127
128new_hashmap: procedure expose values. /* new_hashmap(seq) */
129 seq = arg(1)
130 return new_seq("hash", seq)
131
132hashmap?: procedure /* hashmap?(obj) */
133 return obj_type(arg(1)) == "hash"
134
135contains?: procedure expose values. /* contains?(hm_val, key) */
136 hm_val = arg(1)
137 key = arg(2)
138 do i=1 to words(hm_val) by 2
139 if equal?(key, word(hm_val, i)) then return 1
140 end
141 return 0
142
143hashmap_get: procedure expose values. /* hashmap_get(hm_val, key) */
144 hm_val = arg(1)
145 key = arg(2)
146 do i=1 to words(hm_val) by 2
147 if equal?(key, word(hm_val, i)) then return word(hm_val, i + 1)
148 end
149 return ""
150
151new_nativefn: procedure expose values. /* new_hashmap(native_func_name) */
152 native_func_name = arg(1)
153 idx = new_value_index()
154 values.idx = native_func_name
155 return "nafn_" || idx
156
157nativefn?: procedure /* nativefn?(obj) */
158 return obj_type(arg(1)) == "nafn"
159
160new_func: procedure expose values. /* new_func(body_ast, env_idx, binds) */
161 body_ast = arg(1)
162 env_idx = arg(2)
163 binds = arg(3)
164 is_macro = 0
165 idx = new_value_index()
166 values.idx = body_ast env_idx binds is_macro
167 return "func_" || idx
168
169func?: procedure /* func?(obj) */
170 return obj_type(arg(1)) == "func"
171
172func_macro?: procedure expose values. /* func_macro?(obj) */
173 return func?(arg(1)) & (func_is_macro(arg(1)) == 1)
174
175func_body_ast: procedure expose values. /* func_body_ast(func_obj) */
176 return word(obj_val(arg(1)), 1)
177
178func_env_idx: procedure expose values. /* func_env_idx(func_obj) */
179 return word(obj_val(arg(1)), 2)
180
181func_binds: procedure expose values. /* func_binds(func_obj) */
182 return word(obj_val(arg(1)), 3)
183
184func_is_macro: procedure expose values. /* func_is_macro(func_obj) */
185 return word(obj_val(arg(1)), 4)
186
187func_mark_as_macro: procedure expose values. /* func_mark_as_macro(func_obj) */
188 idx = substr(arg(1), 6)
189 values.idx = subword(values.idx, 1, 3) 1
190 return arg(1)
191
192new_atom: procedure expose values. /* new_atom(obj) */
193 obj = arg(1)
194 idx = new_value_index()
195 values.idx = obj
196 return "atom_" || idx
197
198atom?: procedure /* atom?(obj) */
199 return obj_type(arg(1)) == "atom"
200
201atom_set: procedure expose values. /* atom_set(atom, new_value) */
202 atom = arg(1)
203 new_value = arg(2)
204 idx = substr(atom, 6)
205 values.idx = new_value
206 return new_value
207
208equal_hashmap?: procedure expose values. /* equal_hashmap?(a, b) */
209 hma_val = obj_val(arg(1))
210 hmb_val = obj_val(arg(2))
211 if words(hma_val) \= words(hmb_val) then return 0
212 do i=1 to words(hma_val) by 2
213 a_key = word(hma_val, i)
214 a_val = word(hma_val, i + 1)
215 b_val = hashmap_get(hmb_val, a_key)
216 if b_val == "" then return 0
217 if \equal?(a_val, b_val) then return 0
218 end
219 return 1
220
221equal_sequential?: procedure expose values. /* equal_sequential?(a, b) */
222 a_val = obj_val(arg(1))
223 b_val = obj_val(arg(2))
224 if words(a_val) \= words(b_val) then return 0
225 do i=1 to words(a_val)
226 if \equal?(word(a_val, i), word(b_val, i)) then return 0
227 end
228 return 1
229
230equal?: procedure expose values. /* equal?(a, b) */
231 a = arg(1)
232 b = arg(2)
233 a_type = obj_type(a)
234 b_type = obj_type(b)
235 a_val = obj_val(a)
236 b_val = obj_val(b)
237 select
238 when nil?(a) then return nil?(b)
239 when true?(a) then return true?(b)
240 when false?(a) then return false?(b)
241 when (a_type == "numb" & b_type = "numb") | ,
242 (a_type == "symb" & b_type = "symb") | ,
243 (a_type == "stri" & b_type = "stri") | ,
244 (a_type == "keyw" & b_type = "keyw") then return (obj_val(a) == obj_val(b))
245 when (sequential?(a) & sequential?(b)) then return equal_sequential?(a, b)
246 when (hashmap?(a) & hashmap?(b)) then return equal_hashmap?(a, b)
247 otherwise
248 return 0
249 end
250
251#endif