impl modulo (handle negative divisors how people expect)

This commit is contained in:
Tangent Wantwight 2024-05-18 23:22:50 -04:00
parent 2b6aff0dab
commit ce991fd12a
2 changed files with 7 additions and 0 deletions

View file

@ -11,6 +11,11 @@ describe("expr", () => {
["1 * 2", "2"],
["1 / 2", "0.5"],
["1 // 2", "0"],
["1 % 2", "1"],
["3 % 2", "1"],
["-1 % 2", "1"],
// TODO: might change this! negative dividend is weird no matter what, but positive modulo is arguably the better call?
["1 % -2", "-1"],
// TODO: operator precedence
// TODO: parentheses
])("%s", (expression, result) => {

View file

@ -32,6 +32,7 @@ const MINUS_TOKEN = /\s*(\-)/y;
const TIMES_TOKEN = /\s*(\*)/y;
const FLOOR_TOKEN = /\s*(\/\/)/y;
const DIV_TOKEN = /\s*(\/)/y;
const MOD_TOKEN = /\s*(\%)/y;
const NUMBER_TOKEN = /\s*(\d+)/y;
@ -84,6 +85,7 @@ const Operators: TokenHandler[] = [
makeInfixOp(TIMES_TOKEN, 20, 21, (left, right) => ({ value: left * right })),
makeInfixOp(FLOOR_TOKEN, 20, 21, (left, right) => ({ value: Math.floor(left / right) })),
makeInfixOp(DIV_TOKEN, 20, 21, (left, right) => ({ value: left / right })),
makeInfixOp(MOD_TOKEN, 20, 21, (left, right) => ({ value: ((left % right) + right) % right })),
];
const ZERO = { value: 0 };