[WIP] Update can & pattern to store numbers as validated strs

This commit is contained in:
Jared Ramirez 2021-08-16 16:16:10 -07:00
parent 6741d93517
commit adabf70132
4 changed files with 164 additions and 59 deletions

View file

@ -285,7 +285,11 @@ fn lowlevel_4(symbol: Symbol, op: LowLevel, var_store: &mut VarStore) -> Def {
fn num_max_int(symbol: Symbol, var_store: &mut VarStore) -> Def {
let int_var = var_store.fresh();
let int_precision_var = var_store.fresh();
let body = Int(int_var, int_precision_var, i64::MAX.into());
let body = Int(
int_var,
int_precision_var,
i64::MAX.to_string().into_boxed_str(),
);
Def {
annotation: None,
@ -300,7 +304,11 @@ fn num_max_int(symbol: Symbol, var_store: &mut VarStore) -> Def {
fn num_min_int(symbol: Symbol, var_store: &mut VarStore) -> Def {
let int_var = var_store.fresh();
let int_precision_var = var_store.fresh();
let body = Int(int_var, int_precision_var, i64::MIN.into());
let body = Int(
int_var,
int_precision_var,
i64::MIN.to_string().into_boxed_str(),
);
Def {
annotation: None,
@ -685,7 +693,10 @@ fn num_is_zero(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::Eq,
args: vec![
(arg_var, Var(Symbol::ARG_1)),
(arg_var, Num(unbound_zero_var, 0)),
(
arg_var,
Num(unbound_zero_var, "0".to_string().into_boxed_str()),
),
],
ret_var: bool_var,
};
@ -708,7 +719,10 @@ fn num_is_negative(symbol: Symbol, var_store: &mut VarStore) -> Def {
let body = RunLowLevel {
op: LowLevel::NumGt,
args: vec![
(arg_var, Num(unbound_zero_var, 0)),
(
arg_var,
Num(unbound_zero_var, "0".to_string().into_boxed_str()),
),
(arg_var, Var(Symbol::ARG_1)),
],
ret_var: bool_var,
@ -733,7 +747,10 @@ fn num_is_positive(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::NumGt,
args: vec![
(arg_var, Var(Symbol::ARG_1)),
(arg_var, Num(unbound_zero_var, 0)),
(
arg_var,
Num(unbound_zero_var, "0".to_string().into_boxed_str()),
),
],
ret_var: bool_var,
};
@ -756,14 +773,24 @@ fn num_is_odd(symbol: Symbol, var_store: &mut VarStore) -> Def {
let body = RunLowLevel {
op: LowLevel::Eq,
args: vec![
(arg_var, Int(var_store.fresh(), var_store.fresh(), 1)),
(
arg_var,
Int(
var_store.fresh(),
var_store.fresh(),
1.to_string().into_boxed_str(),
),
),
(
arg_var,
RunLowLevel {
op: LowLevel::NumRemUnchecked,
args: vec![
(arg_var, Var(Symbol::ARG_1)),
(arg_var, Num(unbound_two_var, 2)),
(
arg_var,
Num(unbound_two_var, "2".to_string().into_boxed_str()),
),
],
ret_var: arg_var,
},
@ -790,14 +817,14 @@ fn num_is_even(symbol: Symbol, var_store: &mut VarStore) -> Def {
let body = RunLowLevel {
op: LowLevel::Eq,
args: vec![
(arg_var, Num(arg_num_var, 0)),
(arg_var, Num(arg_num_var, "0".to_string().into_boxed_str())),
(
arg_var,
RunLowLevel {
op: LowLevel::NumRemUnchecked,
args: vec![
(arg_var, Var(Symbol::ARG_1)),
(arg_var, Num(arg_num_var, 2)),
(arg_var, Num(arg_num_var, "2".to_string().into_boxed_str())),
],
ret_var: arg_var,
},
@ -851,7 +878,14 @@ fn num_sqrt(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::NumGte,
args: vec![
(float_var, Var(Symbol::ARG_1)),
(float_var, Float(unbound_zero_var, precision_var, 0.0)),
(
float_var,
Float(
unbound_zero_var,
precision_var,
"0.0".to_string().into_boxed_str(),
),
),
],
ret_var: bool_var,
}),
@ -897,7 +931,14 @@ fn num_log(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::NumGt,
args: vec![
(float_var, Var(Symbol::ARG_1)),
(float_var, Float(unbound_zero_var, precision_var, 0.0)),
(
float_var,
Float(
unbound_zero_var,
precision_var,
"0.0".to_string().into_boxed_str(),
),
),
],
ret_var: bool_var,
}),
@ -1127,7 +1168,11 @@ fn num_int_cast(symbol: Symbol, var_store: &mut VarStore) -> Def {
fn num_max_i128(symbol: Symbol, var_store: &mut VarStore) -> Def {
let int_var = var_store.fresh();
let int_precision_var = var_store.fresh();
let body = Int(int_var, int_precision_var, i128::MAX);
let body = Int(
int_var,
int_precision_var,
i128::MAX.to_string().into_boxed_str(),
);
let std = roc_builtins::std::types();
let solved = std.get(&symbol).unwrap();
@ -1160,7 +1205,10 @@ fn list_is_empty(symbol: Symbol, var_store: &mut VarStore) -> Def {
let body = RunLowLevel {
op: LowLevel::Eq,
args: vec![
(len_var, Num(unbound_zero_var, 0)),
(
len_var,
Num(unbound_zero_var, "0".to_string().into_boxed_str()),
),
(
len_var,
RunLowLevel {
@ -2039,7 +2087,10 @@ fn list_sum(symbol: Symbol, var_store: &mut VarStore) -> Def {
args: vec![
(list_var, Var(Symbol::ARG_1)),
(closure_var, list_sum_add(num_var, var_store)),
(num_var, Num(var_store.fresh(), 0)),
(
num_var,
Num(var_store.fresh(), "0".to_string().into_boxed_str()),
),
],
ret_var,
};
@ -2081,7 +2132,10 @@ fn list_product(symbol: Symbol, var_store: &mut VarStore) -> Def {
args: vec![
(list_var, Var(Symbol::ARG_1)),
(closure_var, list_product_mul(num_var, var_store)),
(num_var, Num(var_store.fresh(), 1)),
(
num_var,
Num(var_store.fresh(), "1".to_string().into_boxed_str()),
),
],
ret_var,
};
@ -2559,7 +2613,10 @@ fn num_rem(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::NotEq,
args: vec![
(num_var, Var(Symbol::ARG_2)),
(num_var, Num(unbound_zero_var, 0)),
(
num_var,
Num(unbound_zero_var, "0".to_string().into_boxed_str()),
),
],
ret_var: bool_var,
},
@ -2662,7 +2719,14 @@ fn num_div_float(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::NotEq,
args: vec![
(num_var, Var(Symbol::ARG_2)),
(num_var, Float(unbound_zero_var, precision_var, 0.0)),
(
num_var,
Float(
unbound_zero_var,
precision_var,
"0.0".to_string().into_boxed_str(),
),
),
],
ret_var: bool_var,
},
@ -2727,7 +2791,11 @@ fn num_div_int(symbol: Symbol, var_store: &mut VarStore) -> Def {
(num_var, Var(Symbol::ARG_2)),
(
num_var,
Int(unbound_zero_var, unbound_zero_precision_var, 0),
Int(
unbound_zero_var,
unbound_zero_precision_var,
0.to_string().into_boxed_str(),
),
),
],
ret_var: bool_var,
@ -2797,7 +2865,10 @@ fn list_first(symbol: Symbol, var_store: &mut VarStore) -> Def {
RunLowLevel {
op: LowLevel::NotEq,
args: vec![
(len_var, Int(zero_var, zero_precision_var, 0)),
(
len_var,
Int(zero_var, zero_precision_var, 0.to_string().into_boxed_str()),
),
(
len_var,
RunLowLevel {
@ -2821,7 +2892,14 @@ fn list_first(symbol: Symbol, var_store: &mut VarStore) -> Def {
op: LowLevel::ListGetUnsafe,
args: vec![
(list_var, Var(Symbol::ARG_1)),
(len_var, Int(zero_var, zero_precision_var, 0)),
(
len_var,
Int(
zero_var,
zero_precision_var,
0.to_string().into_boxed_str(),
),
),
],
ret_var: list_elem_var,
},
@ -2878,7 +2956,10 @@ fn list_last(symbol: Symbol, var_store: &mut VarStore) -> Def {
RunLowLevel {
op: LowLevel::NotEq,
args: vec![
(len_var, Int(num_var, num_precision_var, 0)),
(
len_var,
Int(num_var, num_precision_var, 0.to_string().into_boxed_str()),
),
(
len_var,
RunLowLevel {
@ -2917,7 +2998,14 @@ fn list_last(symbol: Symbol, var_store: &mut VarStore) -> Def {
ret_var: len_var,
},
),
(arg_var, Int(num_var, num_precision_var, 1)),
(
arg_var,
Int(
num_var,
num_precision_var,
1.to_string().into_boxed_str(),
),
),
],
ret_var: len_var,
},