Step 8: numeric tower — exact/inexact predicates + truncate/remainder/modulo

7 new R7RS primitives on the float-based tower (Number of float unchanged):
- exact? / inexact? — integer detection via Float.is_integer
- exact->inexact / inexact->exact — identity / round-to-integer
- truncate — toward zero (floor for positive, ceil for negative)
- remainder — sign follows dividend (= Float.rem)
- modulo — sign follows divisor

8 new tests (2658/2658 pass). No type system, VM, compiler, or parser changes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-04 22:25:40 +00:00
parent 2f3e727a6f
commit b0a4be0f22
3 changed files with 169 additions and 33 deletions

View File

@@ -369,3 +369,68 @@
(assert= 1 (my-or 1 2 3))
(assert= 3 (my-or false false 3))
(assert= false (my-or false false false)))))
(defsuite
"numeric-tower"
(deftest
"exact? recognizes integers"
(do
(assert (exact? 42))
(assert (exact? 0))
(assert (exact? -7))
(assert (not (exact? 3.14)))
(assert (not (exact? 0.5)))))
(deftest
"inexact? recognizes non-integers"
(do
(assert (inexact? 3.14))
(assert (inexact? 0.5))
(assert (not (inexact? 42)))
(assert (not (inexact? 0)))))
(deftest
"exact->inexact identity for floats"
(do
(assert (number? (exact->inexact 42)))
(assert= 42 (exact->inexact 42))
(assert= 3.14 (exact->inexact 3.14))))
(deftest
"inexact->exact rounds to integer"
(do
(assert (integer? (inexact->exact 3.7)))
(assert= 4 (inexact->exact 3.7))
(assert= 3 (inexact->exact 3))
(assert= -4 (inexact->exact -3.7))))
(deftest
"truncate toward zero"
(do
(assert= 3 (truncate 3.7))
(assert= -3 (truncate -3.7))
(assert= 3 (truncate 3.2))
(assert= -3 (truncate -3.2))
(assert= 5 (truncate 5))))
(deftest
"remainder sign follows dividend"
(do
(assert= 1 (remainder 7 3))
(assert= -1 (remainder -7 3))
(assert= 1 (remainder 7 -3))
(assert= -1 (remainder -7 -3))))
(deftest
"modulo sign follows divisor"
(do
(assert= 1 (modulo 7 3))
(assert= 2 (modulo -7 3))
(assert= -2 (modulo 7 -3))
(assert= -1 (modulo -7 -3))))
(deftest
"integer preservation through arithmetic"
(do
(assert (integer? (+ 3 4)))
(assert (integer? (* 3 4)))
(assert (integer? (- 10 3)))
(assert (not (integer? (/ 7 2))))
(assert (integer? (/ 6 3)))
(assert (integer? (floor 3.7)))
(assert (integer? (ceil 3.2)))
(assert (integer? (round 3.5)))
(assert (integer? (truncate 3.7))))))