diff --git a/crates/erg_compiler/context/initialize/mod.rs b/crates/erg_compiler/context/initialize/mod.rs index 4e4254de..5009ea19 100644 --- a/crates/erg_compiler/context/initialize/mod.rs +++ b/crates/erg_compiler/context/initialize/mod.rs @@ -92,6 +92,10 @@ const PROC_WRITE: &str = "write!"; const FILE_LIKE: &str = "FileLike"; const MUTABLE_FILE_LIKE: &str = "FileLike!"; const SHOW: &str = "Show"; +const TO_BOOL: &str = "ToBool"; +const TO_INT: &str = "ToInt"; +const TO_FLOAT: &str = "ToFloat"; +const ROUND: &str = "Round"; const INPUT: &str = "Input"; const OUTPUT: &str = "Output"; const POW_OUTPUT: &str = "PowOutput"; @@ -494,6 +498,7 @@ const FUNC_SLICE: &str = "slice"; const FUNC_SORTED: &str = "sorted"; const FUNC_STATICMETHOD: &str = "staticmethod"; const FUNC_SUM: &str = "sum"; +const FUNC_VARS: &str = "vars"; const FUNC_IF: &str = "if"; const FUNC_IF__: &str = "if__"; const FUNC_DISCARD: &str = "discard"; @@ -571,9 +576,15 @@ const FUNDAMENTAL_CALL: &str = "__call__"; const FUNDAMENTAL_NAME: &str = "__name__"; const FUNDAMENTAL_FILE: &str = "__file__"; const FUNDAMENTAL_PACKAGE: &str = "__package__"; -const FUNDAMENTAL_STR: &str = "__str__"; const FUNDAMENTAL_HASH: &str = "__hash__"; +const FUNDAMENTAL_STR: &str = "__str__"; const FUNDAMENTAL_INT: &str = "__int__"; +const FUNDAMENTAL_BOOL: &str = "__bool__"; +const FUNDAMENTAL_FLOAT: &str = "__float__"; +const FUNDAMENTAL_ROUND: &str = "__round__"; +const FUNDAMENTAL_TRUNC: &str = "__trunc__"; +const FUNDAMENTAL_CEIL: &str = "__ceil__"; +const FUNDAMENTAL_FLOOR: &str = "__floor__"; const FUNDAMENTAL_ITER: &str = "__iter__"; const FUNDAMENTAL_NEXT: &str = "__next__"; const FUNDAMENTAL_MODULE: &str = "__module__"; @@ -708,6 +719,7 @@ const KW_OTHER: &str = "other"; const KW_CONFLICT_RESOLVER: &str = "conflict_resolver"; const KW_EPSILON: &str = "epsilon"; const KW_PATH: &str = "Path"; +const KW_NDIGITS: &str = "ndigits"; pub fn builtins_path() -> PathBuf { erg_pystd_path().join("builtins.d.er") diff --git a/crates/erg_compiler/context/initialize/traits.rs b/crates/erg_compiler/context/initialize/traits.rs index ad2d51da..cb3f2af9 100644 --- a/crates/erg_compiler/context/initialize/traits.rs +++ b/crates/erg_compiler/context/initialize/traits.rs @@ -445,6 +445,41 @@ impl Context { num.register_superclass(poly(ADD, vec![]), &add); num.register_superclass(poly(SUB, vec![]), &sub); num.register_superclass(poly(MUL, vec![]), &mul); + /* ToBool */ + let mut to_bool = Self::builtin_mono_trait(TO_BOOL, 2); + let _Slf = mono_q(SELF, subtypeof(mono(TO_BOOL))); + let op_t = fn0_met(_Slf.clone(), Bool).quantify(); + to_bool.register_builtin_erg_decl(FUNDAMENTAL_BOOL, op_t, Visibility::BUILTIN_PUBLIC); + /* ToInt */ + let mut to_int = Self::builtin_mono_trait(TO_INT, 2); + let _Slf = mono_q(SELF, subtypeof(mono(TO_INT))); + let op_t = fn0_met(_Slf.clone(), Int).quantify(); + to_int.register_builtin_erg_decl(FUNDAMENTAL_INT, op_t, Visibility::BUILTIN_PUBLIC); + /* ToFloat */ + let mut to_float = Self::builtin_mono_trait(TO_FLOAT, 2); + let _Slf = mono_q(SELF, subtypeof(mono(TO_FLOAT))); + let op_t = fn0_met(_Slf.clone(), Float).quantify(); + to_float.register_builtin_erg_decl(FUNDAMENTAL_FLOAT, op_t, Visibility::BUILTIN_PUBLIC); + /* Round */ + let mut round = Self::builtin_mono_trait(ROUND, 2); + let _Slf = mono_q(SELF, subtypeof(mono(ROUND))); + // TODO: Output <: Integral = Int # (default) + let op_t = fn_met( + _Slf.clone(), + vec![], + None, + vec![kw_default(KW_NDIGITS, Nat, Nat)], + None, + Int, + ) + .quantify(); + round.register_builtin_erg_decl(FUNDAMENTAL_ROUND, op_t, Visibility::BUILTIN_PUBLIC); + let op_t = fn0_met(_Slf.clone(), Int).quantify(); + round.register_builtin_erg_decl(FUNDAMENTAL_TRUNC, op_t, Visibility::BUILTIN_PUBLIC); + let op_t = fn0_met(_Slf.clone(), Int).quantify(); + round.register_builtin_erg_decl(FUNDAMENTAL_FLOOR, op_t, Visibility::BUILTIN_PUBLIC); + let op_t = fn0_met(_Slf.clone(), Int).quantify(); + round.register_builtin_erg_decl(FUNDAMENTAL_CEIL, op_t, Visibility::BUILTIN_PUBLIC); self.register_builtin_type(mono(UNPACK), unpack, vis.clone(), Const, None); self.register_builtin_type( mono(INHERITABLE_TYPE), @@ -511,6 +546,10 @@ impl Context { self.register_builtin_type(mono(PARTIAL_ORD), partial_ord, vis.clone(), Const, None); self.register_builtin_type(mono(ORD), ord, vis.clone(), Const, None); self.register_builtin_type(mono(NUM), num, vis.clone(), Const, None); + self.register_builtin_type(mono(TO_BOOL), to_bool, vis.clone(), Const, None); + self.register_builtin_type(mono(TO_INT), to_int, vis.clone(), Const, None); + self.register_builtin_type(mono(TO_FLOAT), to_float, vis.clone(), Const, None); + self.register_builtin_type(mono(ROUND), round, vis.clone(), Const, None); self.register_builtin_type( poly(SEQUENCE, vec![ty_tp(T.clone())]), sequence,