commit 20b90492c047e3b99f894691d4e596dfa74c5713
parent b3400673b940e51488715314374ef8cdc9ff3a41
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Sat, 25 Apr 2026 14:32:11 -0700
scheme1: pending tests for type predicates, quot/rem/mod, min/max/abs, bit-xor/not, num<->str
Five new test files (70-74) covering primitives still to be
implemented. All currently fail with `unbound variable` — they pin
the intended behavior so the implementation can be added under TDD.
70-type-predicates: boolean? integer? procedure? record? record-type?
71-quot-rem-mod: truncating q/r and floor-modulo across all sign combos
72-min-max-abs: 2-arg min/max plus abs sanity
73-bit-xor-not: bitwise xor and complement
74-num-str-conv: decimal round-trip; #f on garbage input
Diffstat:
10 files changed, 140 insertions(+), 0 deletions(-)
diff --git a/tests/scheme1/70-type-predicates.expected-exit b/tests/scheme1/70-type-predicates.expected-exit
@@ -0,0 +1 @@
+0
diff --git a/tests/scheme1/70-type-predicates.scm b/tests/scheme1/70-type-predicates.scm
@@ -0,0 +1,42 @@
+; boolean?, integer?, procedure?, record?, record-type? — tag-checking
+; predicates. TDs are reached via %record-td (no surface name binding).
+
+(define-record-type point (make-point x y) point? (x point-x) (y point-y))
+(define p (make-point 1 2))
+(define td (%record-td p))
+
+; boolean? — only #t and #f
+(if (boolean? #t) 0 (sys-exit 1))
+(if (boolean? #f) 0 (sys-exit 2))
+(if (not (boolean? 0)) 0 (sys-exit 3))
+(if (not (boolean? '())) 0 (sys-exit 4))
+(if (not (boolean? 'foo)) 0 (sys-exit 5))
+
+; integer? — fixnums only
+(if (integer? 0) 0 (sys-exit 6))
+(if (integer? 42) 0 (sys-exit 7))
+(if (integer? -7) 0 (sys-exit 8))
+(if (not (integer? #t)) 0 (sys-exit 9))
+(if (not (integer? '(1 2))) 0 (sys-exit 10))
+(if (not (integer? 'sym)) 0 (sys-exit 11))
+
+; procedure? — closures and primitives
+(if (procedure? car) 0 (sys-exit 12))
+(if (procedure? +) 0 (sys-exit 13))
+(if (procedure? (lambda (x) x)) 0 (sys-exit 14))
+(if (not (procedure? 1)) 0 (sys-exit 15))
+(if (not (procedure? 'car)) 0 (sys-exit 16))
+(if (not (procedure? '())) 0 (sys-exit 17))
+
+; record? — only HDR.REC heap objects
+(if (record? p) 0 (sys-exit 18))
+(if (not (record? td)) 0 (sys-exit 19))
+(if (not (record? 1)) 0 (sys-exit 20))
+(if (not (record? "abc")) 0 (sys-exit 21))
+
+; record-type? — only HDR.TD heap objects
+(if (record-type? td) 0 (sys-exit 22))
+(if (not (record-type? p)) 0 (sys-exit 23))
+(if (not (record-type? 0)) 0 (sys-exit 24))
+
+(sys-exit 0)
diff --git a/tests/scheme1/71-quot-rem-mod.expected-exit b/tests/scheme1/71-quot-rem-mod.expected-exit
@@ -0,0 +1 @@
+0
diff --git a/tests/scheme1/71-quot-rem-mod.scm b/tests/scheme1/71-quot-rem-mod.scm
@@ -0,0 +1,34 @@
+; quotient, remainder, modulo. Truncating semantics for q/r (sign of
+; remainder = sign of dividend); modulo's result has sign of divisor.
+
+; Positive / positive.
+(if (= 3 (quotient 17 5)) 0 (sys-exit 1))
+(if (= 2 (remainder 17 5)) 0 (sys-exit 2))
+(if (= 2 (modulo 17 5)) 0 (sys-exit 3))
+
+; Negative dividend, positive divisor.
+(if (= -3 (quotient -17 5)) 0 (sys-exit 4))
+(if (= -2 (remainder -17 5)) 0 (sys-exit 5))
+(if (= 3 (modulo -17 5)) 0 (sys-exit 6))
+
+; Positive dividend, negative divisor.
+(if (= -3 (quotient 17 -5)) 0 (sys-exit 7))
+(if (= 2 (remainder 17 -5)) 0 (sys-exit 8))
+(if (= -3 (modulo 17 -5)) 0 (sys-exit 9))
+
+; Negative / negative.
+(if (= 3 (quotient -17 -5)) 0 (sys-exit 10))
+(if (= -2 (remainder -17 -5)) 0 (sys-exit 11))
+(if (= -2 (modulo -17 -5)) 0 (sys-exit 12))
+
+; Exact division.
+(if (= 4 (quotient 20 5)) 0 (sys-exit 13))
+(if (= 0 (remainder 20 5)) 0 (sys-exit 14))
+(if (= 0 (modulo 20 5)) 0 (sys-exit 15))
+
+; Dividend smaller than divisor.
+(if (= 0 (quotient 3 7)) 0 (sys-exit 16))
+(if (= 3 (remainder 3 7)) 0 (sys-exit 17))
+(if (= 3 (modulo 3 7)) 0 (sys-exit 18))
+
+(sys-exit 0)
diff --git a/tests/scheme1/72-min-max-abs.expected-exit b/tests/scheme1/72-min-max-abs.expected-exit
@@ -0,0 +1 @@
+0
diff --git a/tests/scheme1/72-min-max-abs.scm b/tests/scheme1/72-min-max-abs.scm
@@ -0,0 +1,19 @@
+; min, max (2-arg), abs.
+
+(if (= 3 (min 3 7)) 0 (sys-exit 1))
+(if (= 3 (min 7 3)) 0 (sys-exit 2))
+(if (= -5 (min -5 -2)) 0 (sys-exit 3))
+(if (= -5 (min 0 -5)) 0 (sys-exit 4))
+(if (= 4 (min 4 4)) 0 (sys-exit 5))
+
+(if (= 7 (max 3 7)) 0 (sys-exit 6))
+(if (= 7 (max 7 3)) 0 (sys-exit 7))
+(if (= -2 (max -5 -2)) 0 (sys-exit 8))
+(if (= 0 (max 0 -5)) 0 (sys-exit 9))
+(if (= 4 (max 4 4)) 0 (sys-exit 10))
+
+(if (= 5 (abs 5)) 0 (sys-exit 11))
+(if (= 5 (abs -5)) 0 (sys-exit 12))
+(if (= 0 (abs 0)) 0 (sys-exit 13))
+
+(sys-exit 0)
diff --git a/tests/scheme1/73-bit-xor-not.expected-exit b/tests/scheme1/73-bit-xor-not.expected-exit
@@ -0,0 +1 @@
+0
diff --git a/tests/scheme1/73-bit-xor-not.scm b/tests/scheme1/73-bit-xor-not.scm
@@ -0,0 +1,14 @@
+; bit-xor (2-arg), bit-not (1-arg).
+
+(if (= 0 (bit-xor 0 0)) 0 (sys-exit 1))
+(if (= #x0f (bit-xor #x0f 0)) 0 (sys-exit 2))
+(if (= 0 (bit-xor #x0f #x0f)) 0 (sys-exit 3))
+(if (= #x33 (bit-xor #x55 #x66)) 0 (sys-exit 4))
+(if (= -1 (bit-xor 0 -1)) 0 (sys-exit 5))
+
+(if (= -1 (bit-not 0)) 0 (sys-exit 6))
+(if (= 0 (bit-not -1)) 0 (sys-exit 7))
+(if (= -2 (bit-not 1)) 0 (sys-exit 8))
+(if (= 4 (bit-not -5)) 0 (sys-exit 9))
+
+(sys-exit 0)
diff --git a/tests/scheme1/74-num-str-conv.expected-exit b/tests/scheme1/74-num-str-conv.expected-exit
@@ -0,0 +1 @@
+0
diff --git a/tests/scheme1/74-num-str-conv.scm b/tests/scheme1/74-num-str-conv.scm
@@ -0,0 +1,26 @@
+; number->string returns a fresh bytevector with the decimal repr.
+; string->number parses decimal (optional leading -) into a fixnum,
+; or #f on garbage / empty input.
+
+(if (bytevector=? "0" (number->string 0)) 0 (sys-exit 1))
+(if (bytevector=? "1" (number->string 1)) 0 (sys-exit 2))
+(if (bytevector=? "42" (number->string 42)) 0 (sys-exit 3))
+(if (bytevector=? "-7" (number->string -7)) 0 (sys-exit 4))
+(if (bytevector=? "1234567" (number->string 1234567)) 0 (sys-exit 5))
+
+(if (= 0 (string->number "0")) 0 (sys-exit 6))
+(if (= 1 (string->number "1")) 0 (sys-exit 7))
+(if (= 42 (string->number "42")) 0 (sys-exit 8))
+(if (= -7 (string->number "-7")) 0 (sys-exit 9))
+(if (= 1234567 (string->number "1234567")) 0 (sys-exit 10))
+
+(if (not (string->number "")) 0 (sys-exit 11))
+(if (not (string->number "-")) 0 (sys-exit 12))
+(if (not (string->number "abc")) 0 (sys-exit 13))
+(if (not (string->number "12a")) 0 (sys-exit 14))
+(if (not (string->number "1.5")) 0 (sys-exit 15))
+
+(if (= 99 (string->number (number->string 99))) 0 (sys-exit 16))
+(if (= -99 (string->number (number->string -99))) 0 (sys-exit 17))
+
+(sys-exit 0)