;; qsort-library.ss and vector-library.ss (combined for hw9 convenience) ;; ;; export: ;; ;; fori= : (num num num (num -> void) -> void) ;; (* perform some action for some range of numbers *) ;; ;; V* : ((vector num) (vector num) -> num) ;; ;; hidden: ;; reduce-vector : ((vector X) Y (X num Y -> Y) -> Y) ;; (* vector-reduce *) (unit/sig (fori= V* reduce-vector) (import plt:userspace^) (define (fori= start end step p) (if (>= start end) (void) (begin (p start) (fori= (+ start step) end step p)))) ;; reduce-vector: ;; (num alpha (num (union alpha beta) -> beta) -> (union alpha beta)) ;; N: num ;; base: alpha ;; combine: num (union alpha beta) -> beta ;; result: (union alpha beta) ;; Reduce the vector from right to left, structurally (define (reduce-vector N base combine) (cond ((= N 0) base) (else (combine (sub1 N) (reduce-vector (sub1 N) base combine))))) ;; From vectors to lists (define (vec->list vec) (reverse! (reduce-vector (vector-length vec) null (lambda (i rest) (cons (vector-ref vec i) rest))))) ;(printf "test vec->list: ~s should be ~s~n" ; (vec->list (vector 3 4)) (vector->list (vector 3 4))) ;; The norm of a vector (define (norm vec) (sqrt (reduce-vector (vector-length vec) 0 (lambda (i rest) (+ (square (vector-ref vec i)) rest))))) (define (square x) (* x x)) ;(printf "test norm: ~s should be 5~n" (norm (vector 3 4))) ;; The V* product of a vector (define (V* vec1 vec2) (unless (= (vector-length vec1) (vector-length vec2)) (error 'S* "the vectors must be of the same length")) (reduce-vector (vector-length vec1) 0 (lambda (i rest) (+ (* (vector-ref vec1 i) (vector-ref vec2 i)) rest)))) ;(printf "test s*: ~s should be 12~n" (s* (vector 3 4 5) (vector 1 1 1))) )