; an array of zeroes
(define (zeroes vec)
(let loop ((lo 0) (hi (- (vector-length vec) 1)) (counter 0))
(cond ((< hi lo) (values counter vec))
((zero? (vector-ref vec lo))
(vector-set! vec lo (vector-ref vec hi))
(vector-set! vec hi 0)
(loop lo (- hi 1) counter))
(else (loop (+ lo 1) hi (+ counter 1))))))
(call-with-values
(lambda () (zeroes '#(1 0 2 3 0 0 4)))
(lambda (count vec)
(display count) (display " ")
(display vec) (newline)))
(call-with-values
(lambda () (zeroes '#(0 0 0 0 0)))
(lambda (count vec)
(display count) (display " ")
(display vec) (newline)))
(call-with-values
(lambda () (zeroes '#(1 1 1 1 1)))
(lambda (count vec)
(display count) (display " ")
(display vec) (newline)))
(call-with-values
(lambda () (zeroes '#(0 0 1 2 3 4 0 0)))
(lambda (count vec)
(display count) (display " ")
(display vec) (newline)))
(call-with-values
(lambda () (zeroes '#()))
(lambda (count vec)
(display count) (display " ")
(display vec) (newline)))