erg_compiler/context/initialize/
procs.rs

1#[allow(unused_imports)]
2use erg_common::log;
3
4use crate::ty::constructors::*;
5use crate::ty::typaram::TyParam;
6use crate::ty::{Type, Visibility};
7use Type::*;
8
9use crate::context::initialize::*;
10use crate::context::Context;
11use crate::varinfo::Mutability;
12use Mutability::*;
13
14impl Context {
15    pub(super) fn init_builtin_procs(&mut self) {
16        let vis = if PYTHON_MODE {
17            Visibility::BUILTIN_PUBLIC
18        } else {
19            Visibility::BUILTIN_PRIVATE
20        };
21        let t_breakpoint = proc(
22            vec![],
23            Some(kw(KW_ARGS, Obj)),
24            vec![],
25            Some(kw(KW_KWARGS, Obj)),
26            NoneType,
27        );
28        let T = mono_q("T", instanceof(Type));
29        let U = mono_q("U", instanceof(Type));
30        let t_dir = no_var_proc(
31            vec![],
32            vec![kw(KW_OBJECT, ref_(Obj))],
33            out_list_t(Str, TyParam::erased(Nat)),
34        );
35        let t_print = proc(
36            vec![],
37            Some(kw("objects", ref_(Obj))),
38            vec![
39                kw(KW_SEP, Str),
40                kw(KW_END, Str),
41                kw(KW_FILE, mono("Writable!")),
42                kw(KW_FLUSH, Bool),
43            ],
44            None,
45            NoneType,
46        );
47        let t_id = nd_func(vec![kw(KW_OLD, Obj)], None, Nat);
48        let t_input = no_var_proc(vec![], vec![kw(KW_MSG, Str)], Str);
49        let t_if = no_var_proc(
50            vec![
51                kw(KW_COND, Bool),
52                kw(KW_THEN, nd_proc(vec![], None, T.clone())),
53            ],
54            vec![kw_default(
55                KW_ELSE,
56                nd_proc(vec![], None, U.clone()),
57                nd_proc(vec![], None, NoneType),
58            )],
59            or(T.clone(), U.clone()),
60        )
61        .quantify();
62        let t_proc_ret = if PYTHON_MODE { Obj } else { NoneType };
63        let t_for = proc(
64            vec![
65                kw(KW_ITERABLE, poly("Iterable", vec![ty_tp(T.clone())])),
66                kw(
67                    KW_PROC,
68                    nd_proc(vec![anon(T.clone())], None, t_proc_ret.clone()),
69                ),
70            ],
71            None,
72            vec![kw("else!", nd_proc(vec![], None, t_proc_ret.clone()))],
73            None,
74            NoneType,
75        )
76        .quantify();
77        let t_globals = no_var_proc(vec![], vec![], out_dict_t(dict! { Str => Obj }.into()));
78        let t_help = nd_proc(vec![kw(KW_OBJECT, ref_(Obj))], None, NoneType);
79        let t_locals = no_var_proc(vec![], vec![], out_dict_t(dict! { Str => Obj }.into()));
80        let t_next = proc(
81            vec![kw(
82                KW_ITERABLE,
83                ref_mut(poly("Iterable", vec![ty_tp(T.clone())]), None),
84            )],
85            None,
86            vec![kw(KW_DEFAULT, T.clone())],
87            None,
88            T.clone(),
89        )
90        .quantify();
91        let t_cond = if PYTHON_MODE {
92            Bool
93        } else {
94            // not Bool! type because `cond` may be the result of evaluation of a mutable object's method returns Bool.
95            nd_proc(vec![], None, Bool)
96        };
97        let t_while = proc(
98            vec![
99                kw("cond!", t_cond),
100                kw(KW_PROC, nd_proc(vec![], None, t_proc_ret.clone())),
101            ],
102            None,
103            vec![kw("else!", nd_proc(vec![], None, t_proc_ret.clone()))],
104            None,
105            NoneType,
106        );
107        let P = mono_q("P", subtypeof(mono("PathLike")));
108        let t_open = no_var_proc(
109            vec![kw(KW_FILE, P)],
110            vec![
111                kw(KW_MODE, Str),
112                kw("buffering", Int),
113                kw(KW_ENCODING, or(Str, NoneType)),
114                kw(KW_ERRORS, or(Str, NoneType)),
115                kw("newline", or(Str, NoneType)),
116                kw("closefd", Bool),
117                // param_t("opener", option),
118            ],
119            mono("File!"),
120        )
121        .quantify();
122        let C = if PYTHON_MODE {
123            mono("ContextManager").structuralize()
124        } else {
125            mono("ContextManager")
126        };
127        let t_with = if PYTHON_MODE {
128            nd_proc(
129                vec![
130                    kw(KW_OBJ, C),
131                    kw(KW_PROC, nd_proc(vec![anon(T)], None, Obj.clone())),
132                ],
133                None,
134                NoneType,
135            )
136            .quantify()
137        } else {
138            nd_proc(
139                vec![
140                    kw(KW_OBJ, C),
141                    kw(KW_PROC, nd_proc(vec![anon(T)], None, U.clone())),
142                ],
143                None,
144                U,
145            )
146            .quantify()
147        };
148        self.register_builtin_py_impl(
149            "breakpoint!",
150            t_breakpoint,
151            Immutable,
152            vis.clone(),
153            Some("breakpoint"),
154        );
155        self.register_builtin_py_impl("dir!", t_dir, Immutable, vis.clone(), Some("dir"));
156        self.register_py_builtin("print!", t_print, Some("print"), 81);
157        self.register_builtin_py_impl("id!", t_id, Immutable, vis.clone(), Some("id"));
158        self.register_builtin_py_impl("input!", t_input, Immutable, vis.clone(), Some("input"));
159        self.register_builtin_py_impl(
160            "globals!",
161            t_globals,
162            Immutable,
163            vis.clone(),
164            Some("globals"),
165        );
166        self.register_builtin_py_impl("help!", t_help, Immutable, vis.clone(), Some("help"));
167        self.register_builtin_py_impl("locals!", t_locals, Immutable, vis.clone(), Some("locals"));
168        self.register_builtin_py_impl("next!", t_next, Immutable, vis.clone(), Some("next"));
169        self.register_py_builtin("open!", t_open, Some("open"), 198);
170        let name = if PYTHON_MODE { "if" } else { "if__" };
171        self.register_builtin_py_impl("if!", t_if, Immutable, vis.clone(), Some(name));
172        let name = if PYTHON_MODE { "for" } else { "for__" };
173        self.register_builtin_py_impl("for!", t_for, Immutable, vis.clone(), Some(name));
174        let name = if PYTHON_MODE { "while" } else { "while__" };
175        self.register_builtin_py_impl("while!", t_while, Immutable, vis.clone(), Some(name));
176        let name = if PYTHON_MODE { "with" } else { "with__" };
177        self.register_builtin_py_impl("with!", t_with, Immutable, vis, Some(name));
178    }
179}