differentiate floor and regular division

This commit is contained in:
2024-10-25 22:48:10 -04:00
parent a28dedb1ea
commit 3ddec422fb
3 changed files with 14 additions and 2 deletions

View File

@@ -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))),

View File

@@ -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])),

View File

@@ -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),