From 7977371e78c49f046178026cf5fdb5299212afe5 Mon Sep 17 00:00:00 2001 From: megamaths Date: Fri, 1 Aug 2025 12:25:02 +0100 Subject: [PATCH 1/3] added integer division --- src/expr/expression.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/expr/expression.rs b/src/expr/expression.rs index 3dea5da..dd40569 100644 --- a/src/expr/expression.rs +++ b/src/expr/expression.rs @@ -325,6 +325,8 @@ enum Token { Mul, /// A literal '/' for division Div, + /// A literal '//' for integer division + IntDiv, /// A literal '%' for mod operation Mod, /// Internal-only token used for separating otherwise @@ -426,7 +428,14 @@ fn tokenize(input: &str) -> Result> { '+' => Token::Add, '-' if !in_elref_id => Token::Sub, // '-' is valid in an ElRef::Id '*' => Token::Mul, - '/' => Token::Div, + '/' => { + if buffer.is_empty() && tokens.last() == Some(&Token::Div) { + tokens.pop(); + Token::IntDiv + } else { + Token::Div + } + } '%' => Token::Mod, ',' => Token::Comma, ' ' | '\t' => Token::Whitespace, @@ -724,6 +733,10 @@ fn factor(eval_state: &mut EvalState) -> Result { eval_state.advance(); e /= primary(eval_state)?.one_number()?; } + Some(Token::IntDiv) => { + eval_state.advance(); + e = ((e as i32) / (primary(eval_state)?.one_number()? as i32)) as f32; + } Some(Token::Mod) => { eval_state.advance(); // note euclid remainder rather than '%' operator @@ -1673,8 +1686,8 @@ mod tests { let ctx = TestContext::new(); for (expr, expected) in [ ( - "{{10, 20 + 3, 2+3 , eq(123, 123), 5/2}}", - "10, 23, 5, 1, 2.5", + "{{10, 20 + 3, 2+3 , eq(123, 123), 5/2, 3//2}}", + "10, 23, 5, 1, 2.5, 1", ), ("{{3, 2, swap(1, 2)}}", "3, 2, 2, 1"), ("{{p2r(10, 0)}}", "10, 0"), From 52f6ef82bafaf5605ff8f34f66bfb536a45dbce6 Mon Sep 17 00:00:00 2001 From: megamaths Date: Sun, 3 Aug 2025 19:53:24 +0100 Subject: [PATCH 2/3] review fixes --- src/expr/expression.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/expr/expression.rs b/src/expr/expression.rs index dd40569..53def51 100644 --- a/src/expr/expression.rs +++ b/src/expr/expression.rs @@ -735,7 +735,7 @@ fn factor(eval_state: &mut EvalState) -> Result { } Some(Token::IntDiv) => { eval_state.advance(); - e = ((e as i32) / (primary(eval_state)?.one_number()? as i32)) as f32; + e = e.div_euclid(primary(eval_state)?.one_number()?); } Some(Token::Mod) => { eval_state.advance(); @@ -1073,6 +1073,8 @@ mod tests { ("6 - 9", -3.), ("-4 * 5", -20.), ("60 / 12", 5.), + ("11 // 4", 2.), + ("-11 // 4", -3.), // ensure -a // b is rounds down ("63 % 4", 3.), ("-1 % 4", 3.), // ensure -a % b is non-negative ("-4 * 4", -16.), From a81fee8c19e3f190e230ac81fa11e96a9c1a979d Mon Sep 17 00:00:00 2001 From: megamaths Date: Sun, 3 Aug 2025 20:04:22 +0100 Subject: [PATCH 3/3] updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b676157..4bbbd23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- Added: integer division with `//`. + - Added: support for text style and colour classes in `` elements. - Fixed: position and attribute expansion for non-empty graphics elements,