refactor(nix/sterni/int): rename div & mod to quot & rem

This mirrors the terminology Haskell uses: quot and rem truncate towards
zero which is also the case for builtins.div. We can give us the option
to introduce Haskell-style int.div and int.mod (to complete the
confusion) which would truncate towards negative infinity.

Change-Id: Ibebb0a01a73c9718cd62121b2fc2a19c3a4be0de
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9009
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
sterni 2023-08-05 17:47:22 +02:00
parent 55a3b3eb81
commit 81fc87e29e
2 changed files with 28 additions and 23 deletions

View file

@ -23,7 +23,7 @@ let
bitShiftR = bit: count:
if count == 0
then bit
else div (bitShiftR bit (count - 1)) 2;
else (bitShiftR bit (count - 1)) / 2;
bitShiftL = bit: count:
if count == 0
@ -85,8 +85,13 @@ let
odd = x: bitAnd x 1 == 1;
even = x: bitAnd x 1 == 0;
inherit (builtins) div;
mod = a: b: let res = a / b; in a - (res * b);
quot' = builtins.div; # no typecheck
rem = a: b:
assert builtins.isInt a && builtins.isInt b;
let res = quot' a b; in a - (res * b);
quot = a: b:
assert builtins.isInt a && builtins.isInt b;
quot' a b;
in
{
@ -96,8 +101,8 @@ in
exp
odd
even
div
mod
quot
rem
bitShiftR
bitShiftL
bitOr

View file

@ -365,7 +365,7 @@ let
checkShiftRDivExp = n:
assertEq "${toString n} >> 5 == ${toString n} / 2 ^ 5"
(int.bitShiftR n 5)
(int.div n (int.exp 2 5));
(n / (int.exp 2 5));
checkShiftLMulExp = n:
assertEq "${toString n} >> 6 == ${toString n} * 2 ^ 6"
@ -406,40 +406,40 @@ let
]);
divisions = [
{ a = 2; b = 1; c = 2; mod = 0; }
{ a = 2; b = 2; c = 1; mod = 0; }
{ a = 20; b = 10; c = 2; mod = 0; }
{ a = 12; b = 5; c = 2; mod = 2; }
{ a = 23; b = 4; c = 5; mod = 3; }
{ a = 2; b = 1; c = 2; rem = 0; }
{ a = 2; b = 2; c = 1; rem = 0; }
{ a = 20; b = 10; c = 2; rem = 0; }
{ a = 12; b = 5; c = 2; rem = 2; }
{ a = 23; b = 4; c = 5; rem = 3; }
];
checkDiv = n: { a, b, c, mod }: [
(assertEq "${n}: div result" (int.div a b) c)
(assertEq "${n}: mod result" (int.mod a b) mod)
(assertEq "${n}: divMod law" ((int.div a b) * b + (int.mod a b)) a)
checkQuot = n: { a, b, c, rem }: [
(assertEq "${n}: quot result" (int.quot a b) c)
(assertEq "${n}: rem result" (int.rem a b) rem)
(assertEq "${n}: quotRem law" ((int.quot a b) * b + (int.rem a b)) a)
];
testDivMod = it "checks integer division and modulo"
testQuotRem = it "checks integer quotient and remainder"
(lib.flatten [
(builtins.map (checkDiv "+a / +b") divisions)
(builtins.map (checkQuot "+a / +b") divisions)
(builtins.map
(fun.rl (checkDiv "-a / +b") (x: x // {
(fun.rl (checkQuot "-a / +b") (x: x // {
a = -x.a;
c = -x.c;
mod = -x.mod;
rem = -x.rem;
}))
divisions)
(builtins.map
(fun.rl (checkDiv "+a / -b") (x: x // {
(fun.rl (checkQuot "+a / -b") (x: x // {
b = -x.b;
c = -x.c;
}))
divisions)
(builtins.map
(fun.rl (checkDiv "-a / -b") (x: x // {
(fun.rl (checkQuot "-a / -b") (x: x // {
a = -x.a;
b = -x.b;
mod = -x.mod;
rem = -x.rem;
}))
divisions)
]);
@ -451,5 +451,5 @@ runTestsuite "nix.int" [
testBasic
testExp
testBit
testDivMod
testQuotRem
]