Step 9: mutable data structures — R7RS vectors

New Vector type (value array) with 11 primitives:
- make-vector, vector — constructors
- vector-ref, vector-set! — element access/mutation
- vector-length, vector?, vector-fill! — inspection
- vector->list, list->vector — conversion
- vector-copy — independent copy
- Element-wise equality in safe_eq

10 new tests (2668/2668 pass). Follows Record pattern (value array).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-04 22:56:10 +00:00
parent 5ac1ca9756
commit 6fe3476e18
3 changed files with 125 additions and 0 deletions

View File

@@ -434,3 +434,77 @@
(assert (integer? (ceil 3.2)))
(assert (integer? (round 3.5)))
(assert (integer? (truncate 3.7))))))
(defsuite
"vectors"
(deftest
"make-vector creates vector of given size"
(let
((v (make-vector 5)))
(do (assert (vector? v)) (assert= 5 (vector-length v)))))
(deftest
"make-vector with fill value"
(let
((v (make-vector 3 42)))
(do
(assert= 42 (vector-ref v 0))
(assert= 42 (vector-ref v 1))
(assert= 42 (vector-ref v 2)))))
(deftest
"vector constructor from args"
(let
((v (vector 1 2 3)))
(do
(assert= 3 (vector-length v))
(assert= 1 (vector-ref v 0))
(assert= 2 (vector-ref v 1))
(assert= 3 (vector-ref v 2)))))
(deftest
"vector-set! mutates in place"
(let
((v (make-vector 3 0)))
(do
(vector-set! v 1 99)
(assert= 99 (vector-ref v 1))
(assert= 0 (vector-ref v 0)))))
(deftest
"vector->list conversion"
(assert= (list 1 2 3) (vector->list (vector 1 2 3))))
(deftest
"list->vector conversion"
(let
((v (list->vector (list 10 20 30))))
(do
(assert (vector? v))
(assert= 3 (vector-length v))
(assert= 20 (vector-ref v 1)))))
(deftest
"vector-fill! sets all elements"
(let
((v (vector 1 2 3)))
(do
(vector-fill! v 0)
(assert= 0 (vector-ref v 0))
(assert= 0 (vector-ref v 1))
(assert= 0 (vector-ref v 2)))))
(deftest
"vector-copy creates independent copy"
(let
((v1 (vector 1 2 3)))
(let
((v2 (vector-copy v1)))
(do
(vector-set! v2 0 99)
(assert= 1 (vector-ref v1 0))
(assert= 99 (vector-ref v2 0))))))
(deftest
"vector? predicate"
(do
(assert (vector? (vector 1 2)))
(assert (not (vector? (list 1 2))))
(assert (not (vector? 42)))))
(deftest
"vector equality"
(do
(assert= (vector 1 2 3) (vector 1 2 3))
(assert (not (= (vector 1 2) (vector 1 3)))))))