1use super::eval::{eval, force_eval, Env, Value};
2use super::number::{BigInt, Complex, Ratio};
3use super::parser::AST;
4use alloc::boxed::Box;
5use alloc::collections::VecDeque;
6use alloc::string::String;
7use alloc::sync::Arc;
8use alloc::vec::Vec;
9use core::sync::atomic::{AtomicBool, Ordering};
10use spin::Mutex;
11
12pub fn register(env: &mut Env) {
13 env.set(String::from("set"), Value::BuiltinFunc(builtin_set));
15 env.set(String::from("func"), Value::BuiltinFunc(builtin_set));
16 env.set(String::from("type"), Value::BuiltinFunc(builtin_type));
17 env.set(String::from("+"), Value::BuiltinFunc(builtin_add));
18 env.set(String::from("-"), Value::BuiltinFunc(builtin_sub));
19 env.set(String::from("*"), Value::BuiltinFunc(builtin_mul));
20 env.set(String::from("/"), Value::BuiltinFunc(builtin_div));
21 env.set(String::from("if"), Value::BuiltinFunc(builtin_if));
22 env.set(
23 String::from("condition"),
24 Value::BuiltinFunc(builtin_condition),
25 );
26 env.set(String::from("case"), Value::BuiltinFunc(builtin_case));
27 env.set(String::from("fn"), Value::BuiltinFunc(builtin_lambda));
28 env.set(String::from("lambda"), Value::BuiltinFunc(builtin_lambda));
29 env.set(String::from("print"), Value::BuiltinFunc(builtin_print));
30 env.set(String::from("while"), Value::BuiltinFunc(builtin_while));
31 env.set(String::from("for"), Value::BuiltinFunc(builtin_for));
32 env.set(String::from("list"), Value::BuiltinFunc(builtin_list));
33 env.set(String::from("cons"), Value::BuiltinFunc(builtin_cons));
34 env.set(String::from("car"), Value::BuiltinFunc(builtin_car));
35 env.set(String::from("cdr"), Value::BuiltinFunc(builtin_cdr));
36 env.set(String::from("map"), Value::BuiltinFunc(builtin_map));
37 env.set(String::from("filter"), Value::BuiltinFunc(builtin_filter));
38 env.set(String::from("fold"), Value::BuiltinFunc(builtin_fold));
39 env.set(String::from("get"), Value::BuiltinFunc(builtin_get));
40 env.set(String::from("length"), Value::BuiltinFunc(builtin_length));
41 env.set(String::from("="), Value::BuiltinFunc(builtin_eq));
42 env.set(String::from("eq"), Value::BuiltinFunc(builtin_eq));
43 env.set(String::from("!="), Value::BuiltinFunc(builtin_neq));
44 env.set(String::from("neq"), Value::BuiltinFunc(builtin_neq));
45 env.set(String::from("<"), Value::BuiltinFunc(builtin_lt));
46 env.set(String::from("lt"), Value::BuiltinFunc(builtin_lt));
47 env.set(String::from("<="), Value::BuiltinFunc(builtin_le));
48 env.set(String::from("le"), Value::BuiltinFunc(builtin_le));
49 env.set(String::from("lte"), Value::BuiltinFunc(builtin_le));
50 env.set(String::from(">"), Value::BuiltinFunc(builtin_gt));
51 env.set(String::from("gt"), Value::BuiltinFunc(builtin_gt));
52 env.set(String::from(">="), Value::BuiltinFunc(builtin_ge));
53 env.set(String::from("ge"), Value::BuiltinFunc(builtin_ge));
54 env.set(String::from("gte"), Value::BuiltinFunc(builtin_ge));
55 env.set(String::from("and"), Value::BuiltinFunc(builtin_and));
56 env.set(String::from("or"), Value::BuiltinFunc(builtin_or));
57 env.set(String::from("not"), Value::BuiltinFunc(builtin_not));
58 env.set(String::from("xor"), Value::BuiltinFunc(builtin_xor));
59 env.set(String::from("show"), Value::BuiltinFunc(builtin_show));
60 env.set(String::from("range"), Value::BuiltinFunc(builtin_range));
61 env.set(String::from("take"), Value::BuiltinFunc(builtin_take));
62 env.set(String::from("to-list"), Value::BuiltinFunc(builtin_to_list));
63
64 env.set(String::from("load"), Value::BuiltinFunc(builtin_load));
66 env.set(String::from("require"), Value::BuiltinFunc(builtin_require));
67
68 env.set(String::from("ls"), Value::BuiltinFunc(builtin_ls));
70 env.set(String::from("cd"), Value::BuiltinFunc(builtin_cd));
71 env.set(String::from("pwd"), Value::BuiltinFunc(builtin_pwd));
72 env.set(String::from("mkdir"), Value::BuiltinFunc(builtin_mkdir));
73 env.set(String::from("cp"), Value::BuiltinFunc(builtin_cp));
74 env.set(String::from("mv"), Value::BuiltinFunc(builtin_mv));
75 env.set(String::from("rm"), Value::BuiltinFunc(builtin_rm));
76 env.set(String::from("cat"), Value::BuiltinFunc(builtin_cat));
77 env.set(String::from("grep"), Value::BuiltinFunc(builtin_grep));
78 env.set(String::from("head"), Value::BuiltinFunc(builtin_head));
79 env.set(String::from("tail"), Value::BuiltinFunc(builtin_tail));
80 env.set(String::from("ping"), Value::BuiltinFunc(builtin_ping));
81 env.set(String::from("help"), Value::BuiltinFunc(builtin_help));
82 env.set(String::from("apps"), Value::BuiltinFunc(builtin_apps));
84
85 let make_dict = |items: &[(&str, fn(&mut Env, &[AST]) -> Result<Value, String>)]| -> Value {
86 let mut d = alloc::collections::BTreeMap::new();
87 for (k, f) in items {
88 d.insert(String::from(*k), Value::BuiltinFunc(*f));
89 }
90 Value::Dict(d)
91 };
92
93 let mut math_dict = alloc::collections::BTreeMap::new();
95 math_dict.insert(String::from("PI"), Value::BuiltinFunc(builtin_pi));
96 math_dict.insert(String::from("EULER"), Value::BuiltinFunc(builtin_euler));
97 math_dict.insert(String::from("abs"), Value::BuiltinFunc(builtin_abs));
98 math_dict.insert(String::from("sign"), Value::BuiltinFunc(builtin_sign));
99 math_dict.insert(String::from("sqrt"), Value::BuiltinFunc(builtin_sqrt));
100 math_dict.insert(String::from("exp"), Value::BuiltinFunc(builtin_exp));
101 math_dict.insert(String::from("log2"), Value::BuiltinFunc(builtin_log2));
102 math_dict.insert(String::from("log10"), Value::BuiltinFunc(builtin_log10));
103 math_dict.insert(String::from("sin"), Value::BuiltinFunc(builtin_sin));
104 math_dict.insert(String::from("cos"), Value::BuiltinFunc(builtin_cos));
105 math_dict.insert(String::from("tan"), Value::BuiltinFunc(builtin_tan));
106 math_dict.insert(String::from("arc-sin"), Value::BuiltinFunc(builtin_asin));
107 math_dict.insert(String::from("arc-cos"), Value::BuiltinFunc(builtin_acos));
108 math_dict.insert(String::from("arc-tan"), Value::BuiltinFunc(builtin_atan));
109 math_dict.insert(String::from("hyp-sin"), Value::BuiltinFunc(builtin_sinh));
110 math_dict.insert(String::from("hyp-cos"), Value::BuiltinFunc(builtin_cosh));
111 math_dict.insert(String::from("hyp-tan"), Value::BuiltinFunc(builtin_tanh));
112 math_dict.insert(
113 String::from("hyp-arc-sin"),
114 Value::BuiltinFunc(builtin_asinh),
115 );
116 math_dict.insert(
117 String::from("hyp-arc-cos"),
118 Value::BuiltinFunc(builtin_acosh),
119 );
120 math_dict.insert(
121 String::from("hyp-arc-tan"),
122 Value::BuiltinFunc(builtin_atanh),
123 );
124 math_dict.insert(
125 String::from("greatest-com-div"),
126 Value::BuiltinFunc(builtin_gcd),
127 );
128 math_dict.insert(
129 String::from("least-com-mul"),
130 Value::BuiltinFunc(builtin_lcm),
131 );
132 math_dict.insert(String::from("random"), Value::BuiltinFunc(builtin_random));
133 math_dict.insert(String::from("odd"), Value::BuiltinFunc(builtin_odd));
134 math_dict.insert(String::from("even"), Value::BuiltinFunc(builtin_even));
135 math_dict.insert(
136 String::from("factorial"),
137 Value::BuiltinFunc(builtin_factorial),
138 );
139 math_dict.insert(String::from("complex"), Value::BuiltinFunc(builtin_complex));
140 math_dict.insert(
141 String::from("real-part"),
142 Value::BuiltinFunc(builtin_real_part),
143 );
144 math_dict.insert(
145 String::from("imag-part"),
146 Value::BuiltinFunc(builtin_imag_part),
147 );
148 math_dict.insert(
149 String::from("numerator"),
150 Value::BuiltinFunc(builtin_numerator),
151 );
152 math_dict.insert(
153 String::from("denominator"),
154 Value::BuiltinFunc(builtin_denominator),
155 );
156 env.set(String::from("math"), Value::Dict(math_dict));
157
158 env.set(
160 String::from("bit"),
161 make_dict(&[
162 ("and", builtin_bit_and),
163 ("or", builtin_bit_or),
164 ("xor", builtin_bit_xor),
165 ("not", builtin_bit_not),
166 ("l-shift", builtin_l_shift),
167 ("r-shift", builtin_r_shift),
168 ]),
169 );
170
171 env.set(
173 String::from("fs"),
174 make_dict(&[
175 ("ls", builtin_ls),
176 ("cd", builtin_cd),
177 ("pwd", builtin_pwd),
178 ("mkdir", builtin_mkdir),
179 ("cp", builtin_cp),
180 ("mv", builtin_mv),
181 ("rm", builtin_rm),
182 ("cat", builtin_cat),
183 ("head", builtin_head),
184 ("tail", builtin_tail),
185 ("grep", builtin_grep),
186 ("save", builtin_save),
187 ("find", builtin_find),
188 ]),
189 );
190
191 env.set(
193 String::from("net"),
194 make_dict(&[
195 ("info", builtin_net),
196 ("nic", builtin_nic),
197 ("dhcp", builtin_dhcp),
198 ("arp", builtin_arp),
199 ("dns", builtin_dns),
200 ("netbench", builtin_netbench),
201 ("udp", builtin_udp),
202 ("tcp", builtin_tcp),
203 ("http", builtin_http),
204 ("https", builtin_https),
205 ("ping", builtin_ping),
206 ("ntp", builtin_ntp),
207 ]),
208 );
209
210 env.set(String::from("date"), Value::BuiltinFunc(builtin_date));
212 env.set(String::from("ntp"), Value::BuiltinFunc(builtin_ntp));
213
214 env.set(
216 String::from("drive"),
217 make_dict(&[
218 ("ls", builtin_drive_ls),
219 ("cat", builtin_drive_cat),
220 ("download", builtin_drive_download),
221 ("upload", builtin_drive_upload),
222 ("rm", builtin_drive_rm),
223 ]),
224 );
225
226 env.set(
228 String::from("gh"),
229 make_dict(&[
230 ("login", builtin_gh_login),
231 ("poll", builtin_gh_poll),
232 ("user", builtin_gh_user),
233 ("repos", builtin_gh_repos),
234 ("logout", builtin_gh_logout),
235 ]),
236 );
237
238 env.set(
240 String::from("dom"),
241 make_dict(&[
242 ("get_value", builtin_dom_get_value),
243 ("set_value", builtin_dom_set_value),
244 ("get_content", builtin_dom_get_content),
245 ("set_content", builtin_dom_set_content),
246 ]),
247 );
248
249 env.set(
251 String::from("browser"),
252 make_dict(&[("scroll", builtin_browser_scroll)]),
253 );
254
255 env.set(
257 String::from("os"),
258 make_dict(&[
259 ("settings", builtin_settings),
260 ("keymap", builtin_keymap),
261 ("addlabel", builtin_addlabel),
262 ("corrupt", builtin_corrupt),
263 ("apps", builtin_apps),
264 ("run", builtin_run),
265 ("launch_gui", builtin_sys_launch_gui),
266 ("help", builtin_help),
267 ("keyrepeat", builtin_keyrepeat),
268 ("template-eval", builtin_os_template_eval),
269 ("set_template_guard", builtin_os_set_template_guard),
270 (
271 "set_template_post_guard",
272 builtin_os_set_template_post_guard,
273 ),
274 ]),
275 );
276
277 env.set(
279 String::from("sound"),
280 make_dict(&[
281 ("play", builtin_play),
282 ("play_mml", builtin_play_mml),
283 ("music", builtin_music),
284 ]),
285 );
286
287 env.set(
289 String::from("draw"),
290 make_dict(&[
291 ("create_canvas", builtin_create_canvas),
292 ("boxfill", builtin_boxfill),
293 ("draw_string", builtin_draw_string),
294 ("clear_screen", builtin_clear_screen),
295 ]),
296 );
297
298 let mut task_dict = alloc::collections::BTreeMap::new();
300 task_dict.insert(
301 String::from("parallel"),
302 Value::BuiltinFunc(builtin_task_parallel),
303 );
304 task_dict.insert(
305 String::from("fork_join"),
306 Value::BuiltinFunc(builtin_task_fork_join),
307 );
308 task_dict.insert(
309 String::from("queue"),
310 Value::BuiltinFunc(builtin_task_queue),
311 );
312 task_dict.insert(String::from("send"), Value::BuiltinFunc(builtin_task_send));
313 task_dict.insert(String::from("recv"), Value::BuiltinFunc(builtin_task_recv));
314 task_dict.insert(
315 String::from("close"),
316 Value::BuiltinFunc(builtin_task_close),
317 );
318 env.set(String::from("task"), Value::Dict(task_dict));
319
320 let mut str_dict = alloc::collections::BTreeMap::new();
322 str_dict.insert(String::from("split"), Value::BuiltinFunc(builtin_str_split));
323 str_dict.insert(String::from("join"), Value::BuiltinFunc(builtin_str_join));
324 str_dict.insert(
325 String::from("substring"),
326 Value::BuiltinFunc(builtin_str_substring),
327 );
328 str_dict.insert(
329 String::from("length"),
330 Value::BuiltinFunc(builtin_str_length),
331 );
332 str_dict.insert(
333 String::from("replace"),
334 Value::BuiltinFunc(builtin_str_replace),
335 );
336 env.set(String::from("str"), Value::Dict(str_dict));
337}
338
339fn eval_args(env: &mut Env, args: &[AST]) -> Result<Vec<Value>, String> {
340 let mut vals = Vec::new();
341 for arg in args {
342 let val = eval(env, arg)?;
343 vals.push(force_eval(env, val)?);
344 }
345 Ok(vals)
346}
347
348
349mod arith;
355mod compare_list;
356mod math;
357mod os_fs;
358mod os_net;
359mod cloud;
360mod system;
361mod modules_str_task;
362mod template;
363
364pub(crate) use arith::*;
365pub(crate) use compare_list::*;
366pub(crate) use math::*;
367pub(crate) use os_fs::*;
368pub(crate) use os_net::*;
369pub(crate) use cloud::*;
370pub(crate) use system::*;
371pub(crate) use modules_str_task::*;
372pub(crate) use template::*;