Skip to main content

atmos/os_lib/aura/
builtins.rs

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    // グローバル(保留分)
14    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    // スクリプトファイルのロード
65    env.set(String::from("load"), Value::BuiltinFunc(builtin_load));
66    env.set(String::from("require"), Value::BuiltinFunc(builtin_require));
67
68    // 一般的なUnix/Linuxコマンドのエイリアス(コマンドライン用)
69    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    // `apps` を bare コマンドとしても使える(`os.apps` のエイリアス)
83    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    // math
94    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    // bit
159    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    // fs
172    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    // net
192    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    // 時刻系コマンド(トップレベル)
211    env.set(String::from("date"), Value::BuiltinFunc(builtin_date));
212    env.set(String::from("ntp"), Value::BuiltinFunc(builtin_ntp));
213
214    // drive(Google Drive CUI。認証状態は drive アプリ/gdrive_auth.json と共有)
215    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    // gh(GitHub CUI。認証状態は gh_auth.json に保存)
227    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    // dom
239    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    // browser(検証用: スクリーンショットで下部セクションを確認するため)
250    env.set(
251        String::from("browser"),
252        make_dict(&[("scroll", builtin_browser_scroll)]),
253    );
254
255    // os
256    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    // sound
278    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    // draw
288    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    // task
299    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    // str
321    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
349// ===== 分割サブモジュール(2026-07-16 リファクタ フェーズ6) =====
350// Aura 言語の組込み関数群。register() と eval_args() を root に残し、算術/比較/
351// 数学/FS/ネット/クラウド/システム/名前空間/テンプレートを builtins/ 配下へ分割。
352// register() が名前で参照し、builtin_run は外部(aura/eval.rs)が参照するため
353// pub(crate) use で全再エクスポート。詳細は walkthrough.md 参照。
354mod 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::*;