;;; This file contains programs from ch9.ss that work with ;;; any representation of vectors; including the built-in one of Scheme. ;;; For that reason make-vector is not defined here ; - Program 9.1, pg. 269 - (define view (lambda (vec) (let ((highest-index (sub1 (vector-length vec)))) (letrec ((loop (lambda (i) (display (vector-ref vec i)) (if (< i highest-index) (begin (display " ") (loop (add1 i))))))) (display "#(") (loop 0) (display ")") (newline))))) ; - End Program - ; - Program 9.3, pg. 271 - (define list->vector (lambda (ls) ((vector-generator (lambda (i) (list-ref ls i))) (length ls)))) ; - End Program - ; - Program 9.4, pg. 271 - (define vector (lambda args (list->vector args))) ; - End Program - ; - Program 9.5, pg. 272 - (define vector-stretch (lambda (vec new-size) (let ((size (vector-length vec))) (let ((gen-proc (lambda (i) (if (< i size) (vector-ref vec i) '())))) ((vector-generator gen-proc) new-size))))) ; - End Program - ; - Program 9.6, pg. 272 - (define vector-copy (lambda (vec) (vector-stretch vec (vector-length vec)))) ; - End Program - ; - Program 9.7, pg. 272 - (define vector-update (lambda (vec k val) (let ((gen-proc (lambda (i) (if (= i k) val (vector-ref vec i))))) ((vector-generator gen-proc) (vector-length vec))))) ; - End Program - ; - Program 9.8, pg. 273 - (define list->vector (lambda (ls) (let ((vec (make-vector (length ls)))) (letrec ((convert (lambda (ls* v i) (if (null? ls*) v (let ((new-v (vector-update v i (car ls*)))) (convert (cdr ls*) new-v (add1 i))))))) (convert ls vec 0))))) ; - End Program - ; - Program 9.9, pg. 273 - (define vector-map (lambda (proc vec) ((vector-generator (lambda (i) (proc (vector-ref vec i)))) (vector-length vec)))) ; - End Program - ; - Program 9.10, pg. 274 - (define multiply-by-scalar (lambda (c vec) (vector-map (lambda (elem) (* c elem)) vec))) ; - End Program - ; - Program 9.11, pg. 274 - (define vector-apply-elementwise-to-both (lambda (proc) (lambda (vec1 vec2) (let ((gen-proc (lambda (i) (proc (vector-ref vec1 i) (vector-ref vec2 i))))) ((vector-generator gen-proc) (vector-length vec1)))))) ; - End Program - ; - Program 9.12, pg. 275 - (define vec+ (vector-apply-elementwise-to-both +)) (define vec* (vector-apply-elementwise-to-both *)) ; - End Program - ; - Program 9.13, pg. 275 - (define vector-sum (lambda (vec) (let ((size (vector-length vec))) (letrec ((helper (lambda (i) (if (= i size) 0 (+ (vector-ref vec i) (helper (add1 i))))))) (helper 0))))) ; - End Program - ; - Program 9.14, pg. 276 - (define vector-product (lambda (vec) (let ((size (vector-length vec))) (letrec ((helper (lambda (i) (if (= i size) 1 (* (vector-ref vec i) (helper (add1 i))))))) (helper 0))))) ; - End Program - ; - Program 9.15, pg. 277 - (define vector-accumulate (lambda (proc seed) (lambda (vec) (let ((size (vector-length vec))) (letrec ((helper (lambda (i) (if (= i size) seed (proc (vector-ref vec i) (helper (add1 i))))))) (helper 0)))))) ; - End Program - ; - Program 9.16, pg. 277 - (define vector->list (vector-accumulate cons '())) ; - End Program - ; - Program 9.17, pg. 279 - (define dot-product (lambda (vec1 vec2) (let ((size (vector-length vec1))) (letrec ((loop (lambda (i acc) (if (= i size) acc (loop (add1 i) (+ acc (* (vector-ref vec1 i) (vector-ref vec2 i)))))))) (loop 0 0))))) ; - End Program -