From 3ddec422fb26f9fae15eee6ee2801ca26404b21a Mon Sep 17 00:00:00 2001 From: minneelyyyy Date: Fri, 25 Oct 2024 22:48:10 -0400 Subject: [PATCH] differentiate floor and regular division --- src/executor.rs | 11 ++++++++++- src/parser.rs | 3 ++- src/tokenizer.rs | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/executor.rs b/src/executor.rs index 8268c20..7422d55 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -185,7 +185,7 @@ where _ => Err(RuntimeError::NoOverloadForTypes("*".into(), 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::Int(x), Value::Float(y)] => Ok(Value::Float(*x as f64 / y)), [Value::Float(x), Value::Float(y)] => Ok(Value::Float(x / y)), @@ -193,6 +193,15 @@ where [x, Value::Nil] => Ok(x.clone()), _ => 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[..] { [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))), diff --git a/src/parser.rs b/src/parser.rs index 575cca7..61093ef 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -137,7 +137,8 @@ impl<'a, I: Iterator>> Parser<'a, I> { (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::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::Mod, FunctionType(Box::new(Type::Any), vec![Type::Any, Type::Any])), (Op::Id, FunctionType(Box::new(Type::Any), vec![Type::Any])), diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 0227a79..6af8bca 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -47,6 +47,7 @@ pub enum Op { Sub, Mul, Div, + FloorDiv, Exp, Equ, Mod, @@ -180,6 +181,7 @@ impl Tokenizer { ("-", Op::Sub), ("*", Op::Mul), ("/", Op::Div), + ("//", Op::FloorDiv), ("**", Op::Exp), ("%", Op::Mod), ("=", Op::Equ),