differentiate floor and regular division
This commit is contained in:
@@ -185,7 +185,7 @@ where
|
|||||||
_ => Err(RuntimeError::NoOverloadForTypes("*".into(), args)),
|
_ => Err(RuntimeError::NoOverloadForTypes("*".into(), args)),
|
||||||
}
|
}
|
||||||
Op::Div => match &args[..] {
|
Op::Div => match &args[..] {
|
||||||
[Value::Int(x), Value::Int(y)] => Ok(Value::Int(x / y)),
|
[Value::Int(x), Value::Int(y)] => Ok(Value::Float(*x as f64 / *y as f64)),
|
||||||
[Value::Float(x), Value::Int(y)] => Ok(Value::Float(x / *y as f64)),
|
[Value::Float(x), Value::Int(y)] => Ok(Value::Float(x / *y as f64)),
|
||||||
[Value::Int(x), Value::Float(y)] => Ok(Value::Float(*x as f64 / y)),
|
[Value::Int(x), Value::Float(y)] => Ok(Value::Float(*x as f64 / y)),
|
||||||
[Value::Float(x), Value::Float(y)] => Ok(Value::Float(x / y)),
|
[Value::Float(x), Value::Float(y)] => Ok(Value::Float(x / y)),
|
||||||
@@ -193,6 +193,15 @@ where
|
|||||||
[x, Value::Nil] => Ok(x.clone()),
|
[x, Value::Nil] => Ok(x.clone()),
|
||||||
_ => Err(RuntimeError::NoOverloadForTypes("/".into(), args)),
|
_ => Err(RuntimeError::NoOverloadForTypes("/".into(), args)),
|
||||||
}
|
}
|
||||||
|
Op::FloorDiv => match &args[..] {
|
||||||
|
[Value::Int(x), Value::Int(y)] => Ok(Value::Int(x / y)),
|
||||||
|
[Value::Float(x), Value::Int(y)] => Ok(Value::Int(*x as i64 / y)),
|
||||||
|
[Value::Int(x), Value::Float(y)] => Ok(Value::Int(x / *y as i64)),
|
||||||
|
[Value::Float(x), Value::Float(y)] => Ok(Value::Int(*x as i64 / *y as i64)),
|
||||||
|
[Value::Nil, x] => Ok(x.clone()),
|
||||||
|
[x, Value::Nil] => Ok(x.clone()),
|
||||||
|
_ => Err(RuntimeError::NoOverloadForTypes("//".into(), args)),
|
||||||
|
}
|
||||||
Op::Exp => match &args[..] {
|
Op::Exp => match &args[..] {
|
||||||
[Value::Int(x), Value::Int(y)] => Ok(Value::Float((*x as f64).powf(*y as f64))),
|
[Value::Int(x), Value::Int(y)] => Ok(Value::Float((*x as f64).powf(*y as f64))),
|
||||||
[Value::Float(x), Value::Int(y)] => Ok(Value::Float(x.powf(*y as f64))),
|
[Value::Float(x), Value::Int(y)] => Ok(Value::Float(x.powf(*y as f64))),
|
||||||
|
|||||||
@@ -137,7 +137,8 @@ impl<'a, I: Iterator<Item = Result<Token, TokenizeError>>> Parser<'a, I> {
|
|||||||
(Op::Add, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
(Op::Add, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
||||||
(Op::Sub, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
(Op::Sub, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
||||||
(Op::Mul, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
(Op::Mul, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
||||||
(Op::Div, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
(Op::Div, FunctionType(Box::new(Type::Float), vec![Type::Any, Type::Any])),
|
||||||
|
(Op::FloorDiv, FunctionType(Box::new(Type::Int), vec![Type::Any, Type::Any])),
|
||||||
(Op::Exp, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
(Op::Exp, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
||||||
(Op::Mod, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
(Op::Mod, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])),
|
||||||
(Op::Id, FunctionType(Box::new(Type::Any), vec![Type::Any])),
|
(Op::Id, FunctionType(Box::new(Type::Any), vec![Type::Any])),
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ pub enum Op {
|
|||||||
Sub,
|
Sub,
|
||||||
Mul,
|
Mul,
|
||||||
Div,
|
Div,
|
||||||
|
FloorDiv,
|
||||||
Exp,
|
Exp,
|
||||||
Equ,
|
Equ,
|
||||||
Mod,
|
Mod,
|
||||||
@@ -180,6 +181,7 @@ impl<R: BufRead> Tokenizer<R> {
|
|||||||
("-", Op::Sub),
|
("-", Op::Sub),
|
||||||
("*", Op::Mul),
|
("*", Op::Mul),
|
||||||
("/", Op::Div),
|
("/", Op::Div),
|
||||||
|
("//", Op::FloorDiv),
|
||||||
("**", Op::Exp),
|
("**", Op::Exp),
|
||||||
("%", Op::Mod),
|
("%", Op::Mod),
|
||||||
("=", Op::Equ),
|
("=", Op::Equ),
|
||||||
|
|||||||
Reference in New Issue
Block a user