boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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:
Atests/scheme1/70-type-predicates.expected-exit | 1+
Atests/scheme1/70-type-predicates.scm | 42++++++++++++++++++++++++++++++++++++++++++
Atests/scheme1/71-quot-rem-mod.expected-exit | 1+
Atests/scheme1/71-quot-rem-mod.scm | 34++++++++++++++++++++++++++++++++++
Atests/scheme1/72-min-max-abs.expected-exit | 1+
Atests/scheme1/72-min-max-abs.scm | 19+++++++++++++++++++
Atests/scheme1/73-bit-xor-not.expected-exit | 1+
Atests/scheme1/73-bit-xor-not.scm | 14++++++++++++++
Atests/scheme1/74-num-str-conv.expected-exit | 1+
Atests/scheme1/74-num-str-conv.scm | 26++++++++++++++++++++++++++
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)