Add canonical Expr implementation for NumPow

This commit is contained in:
Dimitar Apostolov 2020-09-10 13:42:18 +02:00
parent 5bbee6217b
commit 51a6e0bde0
4 changed files with 26 additions and 2 deletions

View file

@ -90,6 +90,7 @@ pub fn builtin_defs(var_store: &mut VarStore) -> MutMap<Symbol, Def> {
Symbol::NUM_IS_POSITIVE => num_is_positive, Symbol::NUM_IS_POSITIVE => num_is_positive,
Symbol::NUM_IS_NEGATIVE => num_is_negative, Symbol::NUM_IS_NEGATIVE => num_is_negative,
Symbol::NUM_TO_FLOAT => num_to_float, Symbol::NUM_TO_FLOAT => num_to_float,
Symbol::NUM_POW => num_pow,
} }
} }
@ -578,6 +579,28 @@ fn num_round(symbol: Symbol, var_store: &mut VarStore) -> Def {
) )
} }
/// Num.pow : Float, Float -> Float
fn num_pow(symbol: Symbol, var_store: &mut VarStore) -> Def {
let float_var = var_store.fresh();
let body = RunLowLevel {
op: LowLevel::NumPow,
args: vec![
(float_var, Var(Symbol::ARG_1)),
(float_var, Var(Symbol::ARG_2)),
],
ret_var: float_var,
};
defn(
symbol,
vec![(float_var, Symbol::ARG_1), (float_var, Symbol::ARG_2)],
var_store,
body,
float_var,
)
}
/// List.isEmpty : List * -> Bool /// List.isEmpty : List * -> Bool
fn list_is_empty(symbol: Symbol, var_store: &mut VarStore) -> Def { fn list_is_empty(symbol: Symbol, var_store: &mut VarStore) -> Def {
let list_var = var_store.fresh(); let list_var = var_store.fresh();

View file

@ -1733,7 +1733,7 @@ fn run_low_level<'a, 'ctx, 'env>(
} }
NumAdd | NumSub | NumMul | NumLt | NumLte | NumGt | NumGte | NumRemUnchecked NumAdd | NumSub | NumMul | NumLt | NumLte | NumGt | NumGte | NumRemUnchecked
| NumDivUnchecked => { | NumDivUnchecked | NumPow => {
debug_assert_eq!(args.len(), 2); debug_assert_eq!(args.len(), 2);
let (lhs_arg, lhs_layout) = load_symbol_and_layout(env, scope, &args[0]); let (lhs_arg, lhs_layout) = load_symbol_and_layout(env, scope, &args[0]);

View file

@ -35,6 +35,7 @@ pub enum LowLevel {
NumSqrtUnchecked, NumSqrtUnchecked,
NumRound, NumRound,
NumToFloat, NumToFloat,
NumPow,
Eq, Eq,
NotEq, NotEq,
And, And,

View file

@ -522,7 +522,7 @@ pub fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[bool] {
ListWalkRight => arena.alloc_slice_copy(&[borrowed, irrelevant, owned]), ListWalkRight => arena.alloc_slice_copy(&[borrowed, irrelevant, owned]),
Eq | NotEq | And | Or | NumAdd | NumSub | NumMul | NumGt | NumGte | NumLt | NumLte Eq | NotEq | And | Or | NumAdd | NumSub | NumMul | NumGt | NumGte | NumLt | NumLte
| NumCompare | NumDivUnchecked | NumRemUnchecked => { | NumCompare | NumDivUnchecked | NumRemUnchecked | NumPow => {
arena.alloc_slice_copy(&[irrelevant, irrelevant]) arena.alloc_slice_copy(&[irrelevant, irrelevant])
} }