mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 08:34:33 +00:00
improve compare/Order
This commit is contained in:
parent
cc89088f60
commit
0b19c594c5
3 changed files with 23 additions and 93 deletions
|
@ -251,8 +251,8 @@ fn num_binop(symbol: Symbol, var_store: &mut VarStore, op: LowLevel) -> Def {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Num a, Num a -> Bool
|
/// Num a, Num a -> b
|
||||||
fn num_bool_binop(symbol: Symbol, var_store: &mut VarStore, op: LowLevel) -> Def {
|
fn num_num_other_binop(symbol: Symbol, var_store: &mut VarStore, op: LowLevel) -> Def {
|
||||||
let num_var = var_store.fresh();
|
let num_var = var_store.fresh();
|
||||||
let bool_var = var_store.fresh();
|
let bool_var = var_store.fresh();
|
||||||
let body = RunLowLevel {
|
let body = RunLowLevel {
|
||||||
|
@ -381,27 +381,27 @@ fn num_mul(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
|
|
||||||
/// Num.isGt : Num a, Num a -> Bool
|
/// Num.isGt : Num a, Num a -> Bool
|
||||||
fn num_gt(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn num_gt(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
num_bool_binop(symbol, var_store, LowLevel::NumGt)
|
num_num_other_binop(symbol, var_store, LowLevel::NumGt)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Num.isGte : Num a, Num a -> Bool
|
/// Num.isGte : Num a, Num a -> Bool
|
||||||
fn num_gte(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn num_gte(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
num_bool_binop(symbol, var_store, LowLevel::NumGte)
|
num_num_other_binop(symbol, var_store, LowLevel::NumGte)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Num.isLt : Num a, Num a -> Bool
|
/// Num.isLt : Num a, Num a -> Bool
|
||||||
fn num_lt(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn num_lt(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
num_bool_binop(symbol, var_store, LowLevel::NumLt)
|
num_num_other_binop(symbol, var_store, LowLevel::NumLt)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Num.isLte : Num a, Num a -> Num a
|
/// Num.isLte : Num a, Num a -> Bool
|
||||||
fn num_lte(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn num_lte(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
num_bool_binop(symbol, var_store, LowLevel::NumLte)
|
num_num_other_binop(symbol, var_store, LowLevel::NumLte)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Num.compare : Num a, Num a -> [ LT, EQ, GT ]
|
/// Num.compare : Num a, Num a -> [ LT, EQ, GT ]
|
||||||
fn num_compare(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
fn num_compare(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||||
num_bool_binop(symbol, var_store, LowLevel::NumCompare)
|
num_num_other_binop(symbol, var_store, LowLevel::NumCompare)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Num.sin : Float -> Float
|
/// Num.sin : Float -> Float
|
||||||
|
|
|
@ -13,15 +13,7 @@ mod helpers;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod gen_num {
|
mod gen_num {
|
||||||
/*
|
use roc_std::RocOrder;
|
||||||
use inkwell::passes::PassManager;
|
|
||||||
use inkwell::types::BasicType;
|
|
||||||
use inkwell::OptimizationLevel;
|
|
||||||
use roc_gen::llvm::build::{build_proc, build_proc_header};
|
|
||||||
use roc_gen::llvm::convert::basic_type_from_layout;
|
|
||||||
use roc_mono::layout::Layout;
|
|
||||||
use roc_types::subs::Subs;
|
|
||||||
*/
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn f64_sqrt() {
|
fn f64_sqrt() {
|
||||||
|
@ -584,86 +576,16 @@ mod gen_num {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn int_compare() {
|
fn int_compare() {
|
||||||
assert_evals_to!(
|
assert_evals_to!("Num.compare 0 1", RocOrder::Lt, RocOrder);
|
||||||
indoc!(
|
assert_evals_to!("Num.compare 1 1", RocOrder::Eq, RocOrder);
|
||||||
r#"
|
assert_evals_to!("Num.compare 1 0", RocOrder::Gt, RocOrder);
|
||||||
when Num.compare 0 1 is
|
|
||||||
LT -> 0
|
|
||||||
EQ -> 1
|
|
||||||
GT -> 2
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
0,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
when Num.compare 1 1 is
|
|
||||||
LT -> 0
|
|
||||||
EQ -> 1
|
|
||||||
GT -> 2
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
1,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
when Num.compare 1 0 is
|
|
||||||
LT -> 0
|
|
||||||
EQ -> 1
|
|
||||||
GT -> 2
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
2,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn float_compare() {
|
fn float_compare() {
|
||||||
assert_evals_to!(
|
assert_evals_to!("Num.compare 0.01 3.14", RocOrder::Lt, RocOrder);
|
||||||
indoc!(
|
assert_evals_to!("Num.compare 3.14 3.14", RocOrder::Eq, RocOrder);
|
||||||
r#"
|
assert_evals_to!("Num.compare 3.14 0.01", RocOrder::Gt, RocOrder);
|
||||||
when Num.compare 0 3.14 is
|
|
||||||
LT -> 0
|
|
||||||
EQ -> 1
|
|
||||||
GT -> 2
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
0,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
when Num.compare 3.14 3.14 is
|
|
||||||
LT -> 0
|
|
||||||
EQ -> 1
|
|
||||||
GT -> 2
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
1,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
when Num.compare 3.14 0 is
|
|
||||||
LT -> 0
|
|
||||||
EQ -> 1
|
|
||||||
GT -> 2
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
2,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -11,6 +11,14 @@ extern "C" {
|
||||||
|
|
||||||
const REFCOUNT_1: usize = isize::MIN as usize;
|
const REFCOUNT_1: usize = isize::MIN as usize;
|
||||||
|
|
||||||
|
#[repr(u8)]
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
pub enum RocOrder {
|
||||||
|
Eq = 0,
|
||||||
|
Gt = 1,
|
||||||
|
Lt = 2,
|
||||||
|
}
|
||||||
|
|
||||||
//#[macro_export]
|
//#[macro_export]
|
||||||
//macro_rules! roclist {
|
//macro_rules! roclist {
|
||||||
// () => (
|
// () => (
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue