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 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 ],
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}