Vector Filter
eharetea

Creating a vector-filter function without the use of lists as an intermediate value.

Creating a vector-filter function without the use of lists as an intermediate value.

Date Created:Sunday October 26th, 2008 06:06 PM
Date Modified:Sunday October 26th, 2008 06:10 PM

```(define (vector-filter pred vec)
(let ((num (vector-filter-count pred vec 0 (- (vector-length vec) 1))))
(vector-fill pred (make-vector num) vec 0 0)
)
)
;; THIS DETERMINES THE NUMBER OF VALUES THAT RETURN TRUE FOR THE PREDICATE
(define (vector-filter-count pred vec count n)
(if (= n -1)
count
(let ((val (vector-ref vec n)))
(if (pred val)
(vector-filter-count pred vec (+ count 1) (- n 1))
(vector-filter-count pred vec count (- n 1))))))

;; THIS PLACES VALUES INTO THE nth POSITION OF THE NEW VECTOR WHEN
;; THE kth POSITION OF THE OLD VECTOR RETURNS TRUE FOR THE PREDICATE
;; THEREFORE, INCREMENT k each time, but not necessarily n
(define (vector-fill pred vec vec-old n k)
(if (= n (vector-length vec))
vec
(if (pred (vector-ref vec-old k))
(begin
(vector-set! vec n (vector-ref vec-old k))
(vector-fill pred vec vec-old (+ n 1) (+ k 1)))
(vector-fill pred vec vec-old n (+ k 1)))))

(define v1 (vector 0 1 2 3 4 5 6 7 8))

(define pred (lambda (x) (= (modulo x 2) 0)))

;; stk> (vector-filter pred v1)
;; stk> #(0 2 4 6 8)
```