mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 23:04:49 +00:00
adds Num.subChecked
This commit is contained in:
parent
5d2abc2bd2
commit
fe588c120c
8 changed files with 210 additions and 15 deletions
|
@ -83,6 +83,7 @@ pub fn builtin_defs_map(symbol: Symbol, var_store: &mut VarStore) -> Option<Def>
|
|||
NUM_ADD_WRAP => num_add_wrap,
|
||||
NUM_SUB => num_sub,
|
||||
NUM_SUB_WRAP => num_sub_wrap,
|
||||
NUM_SUB_CHECKED => num_sub_checked,
|
||||
NUM_MUL => num_mul,
|
||||
NUM_GT => num_gt,
|
||||
NUM_GTE => num_gte,
|
||||
|
@ -374,12 +375,12 @@ fn num_add(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
|||
num_binop(symbol, var_store, LowLevel::NumAdd)
|
||||
}
|
||||
|
||||
/// Num.add : Num a, Num a -> Num a
|
||||
/// Num.addWrap : Int, Int -> Int
|
||||
fn num_add_wrap(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||
num_binop(symbol, var_store, LowLevel::NumAddWrap)
|
||||
}
|
||||
|
||||
/// Num.add : Num a, Num a -> Num a
|
||||
/// Num.addChecked : Num a, Num a -> Result (Num a) [ Overflow ]*
|
||||
fn num_add_checked(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||
let bool_var = var_store.fresh();
|
||||
let num_var_1 = var_store.fresh();
|
||||
|
@ -473,11 +474,100 @@ fn num_sub(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
|||
num_binop(symbol, var_store, LowLevel::NumSub)
|
||||
}
|
||||
|
||||
/// Num.subWrap : Num a, Num a -> Num a
|
||||
/// Num.subWrap : Int, Int -> Int
|
||||
fn num_sub_wrap(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||
num_binop(symbol, var_store, LowLevel::NumSubWrap)
|
||||
}
|
||||
|
||||
/// Num.subChecked : Num a, Num a -> Result (Num a) [ Overflow ]*
|
||||
fn num_sub_checked(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||
let bool_var = var_store.fresh();
|
||||
let num_var_1 = var_store.fresh();
|
||||
let num_var_2 = var_store.fresh();
|
||||
let num_var_3 = var_store.fresh();
|
||||
let ret_var = var_store.fresh();
|
||||
let record_var = var_store.fresh();
|
||||
|
||||
// let arg_3 = RunLowLevel NumSubChecked arg_1 arg_2
|
||||
//
|
||||
// if arg_3.b then
|
||||
// # overflow
|
||||
// Err Overflow
|
||||
// else
|
||||
// # all is well
|
||||
// Ok arg_3.a
|
||||
|
||||
let cont = If {
|
||||
branch_var: ret_var,
|
||||
cond_var: bool_var,
|
||||
branches: vec![(
|
||||
// if-condition
|
||||
no_region(
|
||||
// arg_3.b
|
||||
Access {
|
||||
record_var,
|
||||
ext_var: var_store.fresh(),
|
||||
field: "b".into(),
|
||||
field_var: var_store.fresh(),
|
||||
loc_expr: Box::new(no_region(Var(Symbol::ARG_3))),
|
||||
},
|
||||
),
|
||||
// overflow!
|
||||
no_region(tag(
|
||||
"Err",
|
||||
vec![tag("Overflow", Vec::new(), var_store)],
|
||||
var_store,
|
||||
)),
|
||||
)],
|
||||
final_else: Box::new(
|
||||
// all is well
|
||||
no_region(
|
||||
// Ok arg_3.a
|
||||
tag(
|
||||
"Ok",
|
||||
vec![
|
||||
// arg_3.a
|
||||
Access {
|
||||
record_var,
|
||||
ext_var: var_store.fresh(),
|
||||
field: "a".into(),
|
||||
field_var: num_var_3,
|
||||
loc_expr: Box::new(no_region(Var(Symbol::ARG_3))),
|
||||
},
|
||||
],
|
||||
var_store,
|
||||
),
|
||||
),
|
||||
),
|
||||
};
|
||||
|
||||
// arg_3 = RunLowLevel NumSubChecked arg_1 arg_2
|
||||
let def = crate::def::Def {
|
||||
loc_pattern: no_region(Pattern::Identifier(Symbol::ARG_3)),
|
||||
loc_expr: no_region(RunLowLevel {
|
||||
op: LowLevel::NumSubChecked,
|
||||
args: vec![
|
||||
(num_var_1, Var(Symbol::ARG_1)),
|
||||
(num_var_2, Var(Symbol::ARG_2)),
|
||||
],
|
||||
ret_var: record_var,
|
||||
}),
|
||||
expr_var: record_var,
|
||||
pattern_vars: SendMap::default(),
|
||||
annotation: None,
|
||||
};
|
||||
|
||||
let body = LetNonRec(Box::new(def), Box::new(no_region(cont)), ret_var);
|
||||
|
||||
defn(
|
||||
symbol,
|
||||
vec![(num_var_1, Symbol::ARG_1), (num_var_2, Symbol::ARG_2)],
|
||||
var_store,
|
||||
body,
|
||||
ret_var,
|
||||
)
|
||||
}
|
||||
|
||||
/// Num.mul : Num a, Num a -> Num a
|
||||
fn num_mul(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||
num_binop(symbol, var_store, LowLevel::NumMul)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue