mirror of
https://github.com/erg-lang/erg.git
synced 2025-10-01 05:11:09 +00:00
Remove unwrap
s
This commit is contained in:
parent
ce8125379e
commit
f6e1a7b117
7 changed files with 79 additions and 29 deletions
|
@ -911,7 +911,7 @@ impl Context {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn type_of(&self, p: &TyParam) -> Type {
|
fn type_of(&self, p: &TyParam) -> Type {
|
||||||
self.get_tp_t(p).unwrap()
|
self.get_tp_t(p).unwrap_or(Type::Obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sup/inf({±∞}) = ±∞ではあるが、Inf/NegInfにはOrdを実装しない
|
// sup/inf({±∞}) = ±∞ではあるが、Inf/NegInfにはOrdを実装しない
|
||||||
|
@ -926,7 +926,7 @@ impl Context {
|
||||||
if lhs == &refine.var =>
|
if lhs == &refine.var =>
|
||||||
{
|
{
|
||||||
if let Some(max) = &maybe_max {
|
if let Some(max) = &maybe_max {
|
||||||
if self.try_cmp(rhs, max).unwrap() == Greater {
|
if self.try_cmp(rhs, max) == Some(Greater) {
|
||||||
maybe_max = Some(rhs.clone());
|
maybe_max = Some(rhs.clone());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -954,7 +954,7 @@ impl Context {
|
||||||
if lhs == &refine.var =>
|
if lhs == &refine.var =>
|
||||||
{
|
{
|
||||||
if let Some(min) = &maybe_min {
|
if let Some(min) = &maybe_min {
|
||||||
if self.try_cmp(rhs, min).unwrap() == Less {
|
if self.try_cmp(rhs, min) == Some(Less) {
|
||||||
maybe_min = Some(rhs.clone());
|
maybe_min = Some(rhs.clone());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::mem;
|
||||||
use erg_common::Str;
|
use erg_common::Str;
|
||||||
|
|
||||||
use erg_common::astr::AtomicStr;
|
use erg_common::astr::AtomicStr;
|
||||||
use erg_common::color::{RED, RESET};
|
use erg_common::color::{RED, RESET, YELLOW};
|
||||||
use erg_common::error::{ErrorCore, ErrorKind, Location};
|
use erg_common::error::{ErrorCore, ErrorKind, Location};
|
||||||
use erg_type::constructors::{and, builtin_mono, mono};
|
use erg_type::constructors::{and, builtin_mono, mono};
|
||||||
use erg_type::value::{EvalValueResult, TypeKind, TypeObj, ValueObj};
|
use erg_type::value::{EvalValueResult, TypeKind, TypeObj, ValueObj};
|
||||||
|
@ -18,20 +18,32 @@ pub fn class_func(
|
||||||
let require = args.remove_left_or_key("Requirement").ok_or_else(|| {
|
let require = args.remove_left_or_key("Requirement").ok_or_else(|| {
|
||||||
ErrorCore::new(
|
ErrorCore::new(
|
||||||
line!() as usize,
|
line!() as usize,
|
||||||
ErrorKind::KeyError,
|
ErrorKind::TypeError,
|
||||||
Location::Unknown,
|
Location::Unknown,
|
||||||
AtomicStr::from(format!("{RED}Requirement{RESET} is not passed")),
|
AtomicStr::from(format!("{RED}Requirement{RESET} is not passed")),
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let require = require.as_type().unwrap();
|
let require = if let Some(t) = require.as_type() {
|
||||||
|
t
|
||||||
|
} else {
|
||||||
|
return Err(ErrorCore::new(
|
||||||
|
line!() as usize,
|
||||||
|
ErrorKind::TypeError,
|
||||||
|
Location::Unknown,
|
||||||
|
AtomicStr::from(format!(
|
||||||
|
"non-type object {RED}{require}{RESET} is passed to {YELLOW}Requirement{RESET}",
|
||||||
|
)),
|
||||||
|
None,
|
||||||
|
));
|
||||||
|
};
|
||||||
let impls = args.remove_left_or_key("Impl");
|
let impls = args.remove_left_or_key("Impl");
|
||||||
let impls = impls.map(|v| v.as_type().unwrap());
|
let impls = impls.map(|v| v.as_type().unwrap());
|
||||||
let t = mono(mod_name, __name__.unwrap_or(Str::ever("<Lambda>")));
|
let t = mono(mod_name, __name__.unwrap_or(Str::ever("<Lambda>")));
|
||||||
Ok(ValueObj::gen_t(TypeKind::Class, t, require, impls, None))
|
Ok(ValueObj::gen_t(TypeKind::Class, t, require, impls, None))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Super: Type, Impl := Type, Additional := Type -> ClassType
|
/// Super: ClassType, Impl := Type, Additional := Type -> ClassType
|
||||||
pub fn inherit_func(
|
pub fn inherit_func(
|
||||||
mut args: ValueArgs,
|
mut args: ValueArgs,
|
||||||
mod_name: Str,
|
mod_name: Str,
|
||||||
|
@ -46,7 +58,19 @@ pub fn inherit_func(
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let sup = sup.as_type().unwrap();
|
let sup = if let Some(t) = sup.as_type() {
|
||||||
|
t
|
||||||
|
} else {
|
||||||
|
return Err(ErrorCore::new(
|
||||||
|
line!() as usize,
|
||||||
|
ErrorKind::TypeError,
|
||||||
|
Location::Unknown,
|
||||||
|
AtomicStr::from(format!(
|
||||||
|
"non-class object {RED}{sup}{RESET} is passed to {YELLOW}Super{RESET}",
|
||||||
|
)),
|
||||||
|
None,
|
||||||
|
));
|
||||||
|
};
|
||||||
let impls = args.remove_left_or_key("Impl");
|
let impls = args.remove_left_or_key("Impl");
|
||||||
let impls = impls.map(|v| v.as_type().unwrap());
|
let impls = impls.map(|v| v.as_type().unwrap());
|
||||||
let additional = args.remove_left_or_key("Additional");
|
let additional = args.remove_left_or_key("Additional");
|
||||||
|
@ -97,7 +121,7 @@ pub fn inheritable_func(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Requirement: Type, Impl := Type -> ClassType
|
/// Requirement: Type, Impl := Type -> TraitType
|
||||||
pub fn trait_func(
|
pub fn trait_func(
|
||||||
mut args: ValueArgs,
|
mut args: ValueArgs,
|
||||||
mod_name: Str,
|
mod_name: Str,
|
||||||
|
@ -112,14 +136,26 @@ pub fn trait_func(
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let require = require.as_type().unwrap();
|
let require = if let Some(t) = require.as_type() {
|
||||||
|
t
|
||||||
|
} else {
|
||||||
|
return Err(ErrorCore::new(
|
||||||
|
line!() as usize,
|
||||||
|
ErrorKind::TypeError,
|
||||||
|
Location::Unknown,
|
||||||
|
AtomicStr::from(format!(
|
||||||
|
"non-type object {RED}{require}{RESET} is passed to {YELLOW}Requirement{RESET}",
|
||||||
|
)),
|
||||||
|
None,
|
||||||
|
));
|
||||||
|
};
|
||||||
let impls = args.remove_left_or_key("Impl");
|
let impls = args.remove_left_or_key("Impl");
|
||||||
let impls = impls.map(|v| v.as_type().unwrap());
|
let impls = impls.map(|v| v.as_type().unwrap());
|
||||||
let t = mono(mod_name, __name__.unwrap_or(Str::ever("<Lambda>")));
|
let t = mono(mod_name, __name__.unwrap_or(Str::ever("<Lambda>")));
|
||||||
Ok(ValueObj::gen_t(TypeKind::Trait, t, require, impls, None))
|
Ok(ValueObj::gen_t(TypeKind::Trait, t, require, impls, None))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Super: Type, Impl := Type, Additional := Type -> ClassType
|
/// Super: TraitType, Impl := Type, Additional := Type -> TraitType
|
||||||
pub fn subsume_func(
|
pub fn subsume_func(
|
||||||
mut args: ValueArgs,
|
mut args: ValueArgs,
|
||||||
mod_name: Str,
|
mod_name: Str,
|
||||||
|
@ -134,7 +170,19 @@ pub fn subsume_func(
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let sup = sup.as_type().unwrap();
|
let sup = if let Some(t) = sup.as_type() {
|
||||||
|
t
|
||||||
|
} else {
|
||||||
|
return Err(ErrorCore::new(
|
||||||
|
line!() as usize,
|
||||||
|
ErrorKind::TypeError,
|
||||||
|
Location::Unknown,
|
||||||
|
AtomicStr::from(format!(
|
||||||
|
"non-trait object {RED}{sup}{RESET} is passed to {YELLOW}Super{RESET}",
|
||||||
|
)),
|
||||||
|
None,
|
||||||
|
));
|
||||||
|
};
|
||||||
let impls = args.remove_left_or_key("Impl");
|
let impls = args.remove_left_or_key("Impl");
|
||||||
let impls = impls.map(|v| v.as_type().unwrap());
|
let impls = impls.map(|v| v.as_type().unwrap());
|
||||||
let additional = args.remove_left_or_key("Additional");
|
let additional = args.remove_left_or_key("Additional");
|
||||||
|
|
|
@ -1427,14 +1427,12 @@ impl Context {
|
||||||
let insts = self.rec_get_trait_impls(&sup.name());
|
let insts = self.rec_get_trait_impls(&sup.name());
|
||||||
let candidates = insts.into_iter().filter_map(move |inst| {
|
let candidates = insts.into_iter().filter_map(move |inst| {
|
||||||
if self.supertype_of(&inst.sup_trait, &sup) {
|
if self.supertype_of(&inst.sup_trait, &sup) {
|
||||||
Some(
|
self.eval_t_params(
|
||||||
self.eval_t_params(
|
mono_proj(inst.sub_type, rhs),
|
||||||
mono_proj(inst.sub_type, rhs),
|
self.level,
|
||||||
self.level,
|
Location::Unknown,
|
||||||
Location::Unknown,
|
|
||||||
)
|
|
||||||
.unwrap(),
|
|
||||||
)
|
)
|
||||||
|
.ok()
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ impl SideEffectChecker {
|
||||||
///
|
///
|
||||||
/// However, it is not permitted to cause side effects within an instant block in a function
|
/// However, it is not permitted to cause side effects within an instant block in a function
|
||||||
/// (side effects are allowed in instant blocks in procedures and modules)
|
/// (side effects are allowed in instant blocks in procedures and modules)
|
||||||
fn in_context_se_allowed(&self) -> bool {
|
fn in_context_effects_allowed(&self) -> bool {
|
||||||
// if toplevel
|
// if toplevel
|
||||||
if self.block_stack.len() == 1 {
|
if self.block_stack.len() == 1 {
|
||||||
return true;
|
return true;
|
||||||
|
@ -255,7 +255,7 @@ impl SideEffectChecker {
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|name| name.is_procedural())
|
.map(|name| name.is_procedural())
|
||||||
.unwrap_or(false))
|
.unwrap_or(false))
|
||||||
&& !self.in_context_se_allowed()
|
&& !self.in_context_effects_allowed()
|
||||||
{
|
{
|
||||||
self.errs.push(EffectError::has_effect(
|
self.errs.push(EffectError::has_effect(
|
||||||
line!() as usize,
|
line!() as usize,
|
||||||
|
|
|
@ -995,19 +995,19 @@ passed keyword args: {RED}{kw_args_len}{RESET}"
|
||||||
switch_lang!(
|
switch_lang!(
|
||||||
"japanese" => format!(
|
"japanese" => format!(
|
||||||
"{RED}{name}{RESET}は{}行目ですでに移動されています",
|
"{RED}{name}{RESET}は{}行目ですでに移動されています",
|
||||||
moved_loc.ln_begin().unwrap()
|
moved_loc.ln_begin().unwrap_or(0)
|
||||||
),
|
),
|
||||||
"simplified_chinese" => format!(
|
"simplified_chinese" => format!(
|
||||||
"{RED}{name}{RESET}已移至第{}行",
|
"{RED}{name}{RESET}已移至第{}行",
|
||||||
moved_loc.ln_begin().unwrap()
|
moved_loc.ln_begin().unwrap_or(0)
|
||||||
),
|
),
|
||||||
"traditional_chinese" => format!(
|
"traditional_chinese" => format!(
|
||||||
"{RED}{name}{RESET}已移至第{}行",
|
"{RED}{name}{RESET}已移至第{}行",
|
||||||
moved_loc.ln_begin().unwrap()
|
moved_loc.ln_begin().unwrap_or(0)
|
||||||
),
|
),
|
||||||
"english" => format!(
|
"english" => format!(
|
||||||
"{RED}{name}{RESET} was moved in line {}",
|
"{RED}{name}{RESET} was moved in line {}",
|
||||||
moved_loc.ln_begin().unwrap()
|
moved_loc.ln_begin().unwrap_or(0)
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
None,
|
None,
|
||||||
|
|
|
@ -43,7 +43,7 @@ impl Linker {
|
||||||
let code = Expr::Code(Block::new(Vec::from(hir.module)));
|
let code = Expr::Code(Block::new(Vec::from(hir.module)));
|
||||||
let module_type = Expr::Accessor(Accessor::private_with_line(
|
let module_type = Expr::Accessor(Accessor::private_with_line(
|
||||||
Str::ever("#ModuleType"),
|
Str::ever("#ModuleType"),
|
||||||
def.ln_begin().unwrap(),
|
def.ln_begin().unwrap_or(0),
|
||||||
));
|
));
|
||||||
let args =
|
let args =
|
||||||
Args::new(vec![PosArg::new(mod_name.clone())], None, vec![], None);
|
Args::new(vec![PosArg::new(mod_name.clone())], None, vec![], None);
|
||||||
|
@ -59,7 +59,7 @@ impl Linker {
|
||||||
));
|
));
|
||||||
let exec = Expr::Accessor(Accessor::public_with_line(
|
let exec = Expr::Accessor(Accessor::public_with_line(
|
||||||
Str::ever("exec"),
|
Str::ever("exec"),
|
||||||
mod_def.ln_begin().unwrap(),
|
mod_def.ln_begin().unwrap_or(0),
|
||||||
));
|
));
|
||||||
let module = Expr::Accessor(Accessor::Ident(def.sig.ident().clone()));
|
let module = Expr::Accessor(Accessor::Ident(def.sig.ident().clone()));
|
||||||
let __dict__ = Identifier::public("__dict__");
|
let __dict__ = Identifier::public("__dict__");
|
||||||
|
|
|
@ -802,8 +802,12 @@ pub mod value_set {
|
||||||
|
|
||||||
// false -> SyntaxError
|
// false -> SyntaxError
|
||||||
pub fn is_homogeneous(set: &Set<ValueObj>) -> bool {
|
pub fn is_homogeneous(set: &Set<ValueObj>) -> bool {
|
||||||
let l_first = set.iter().next().unwrap().class();
|
if let Some(first) = set.iter().next() {
|
||||||
set.iter().all(|c| c.class() == l_first)
|
let l_first = first.class();
|
||||||
|
set.iter().all(|c| c.class() == l_first)
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner_class(set: &Set<ValueObj>) -> Type {
|
pub fn inner_class(set: &Set<ValueObj>) -> Type {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue