feat: add To{Bool, Int, Float}, Round

This commit is contained in:
Shunsuke Shibayama 2024-03-12 12:45:09 +09:00
parent 0e1c0a9a13
commit 8f68f55c91
2 changed files with 52 additions and 1 deletions

View file

@ -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")

View file

@ -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,