;;; This file contains code that will work only with the Scheme ;;; built in representation of vectors, as it relies essentially on mutation... (load-from-lib "vector-applications.ss") ; - Program 9.21, pg. 283 - (define vector-generator (lambda (gen-proc) (lambda (size) (let ((vec (make-vector size))) (letrec ((loop (lambda (i) (if (< i size) (begin (vector-set! vec i (gen-proc i)) (loop (add1 i))))))) (loop 0)) vec)))) ; - End Program - ; - Program 9.22, pg. 283 - (define vector-update! (lambda (vec i c) (vector-set! vec i c) vec)) ; - End Program - ; - Program 9.23, pg. 284 - (define list->vector (lambda (ls) (let ((vec (make-vector (length ls)))) (letrec ((convert (lambda (ls i) (if (not (null? ls)) (begin (vector-set! vec i (car ls)) (convert (cdr ls) (add1 i))))))) (convert ls 0)) vec))) ; - End Program - ; - Program 9.24, pg. 286 - (define vector-reverse (lambda (vec) (letrec ((switch (lambda (v i j) (if (>= i j) v (let ((swapv (swap-maker v))) (switch (swapv i j) (add1 i) (sub1 j))))))) (switch vec 0 (sub1 (vector-length vec)))))) ; - End Program - ; - Program 9.25, pg. 286 - (define swap-maker (lambda (vec) (lambda (index1 index2) (let ((temp (vector-ref vec index1))) (vector-update (vector-update vec index1 (vector-ref vec index2)) index2 temp))))) ; - End Program - ; - Program 9.26, pg. 287 - (define vector-reverse! (lambda (vec) (let ((swapv! (swap-maker vec))) (letrec ((switch (lambda (i j) (if (< i j) (begin (swapv! i j) (switch (add1 i) (sub1 j))))))) (switch 0 (sub1 (vector-length vec)))) vec))) ; - End Program - ; - Program 9.27, pg. 288 - (define swap-maker (lambda (vec) (lambda (index1 index2) (let ((temp (vector-ref vec index1))) (vector-update! (vector-update! vec index1 (vector-ref vec index2)) index2 temp))))) ; - End Program - ; - Program 9.30, pg. 293 - (define num-cols (lambda (mat) (let ((size (sub1 (vector-length mat)))) (vector-ref mat size)))) ; - End Program - ; - Program 9.31, pg. 294 - (define num-rows (lambda (mat) (let ((size (sub1 (vector-length mat)))) (/ size (vector-ref mat size))))) ; - End Program - ; - Program 9.32, pg. 294 - (define matrix-ref (lambda (mat) (let ((ncols (num-cols mat))) (lambda (i j) (vector-ref mat (+ (* i ncols) j)))))) ; - End Program - ; - Program 9.33, pg. 295 - (define matrix-generator (lambda (gen-proc) (lambda (nrows ncols) (let ((size (* nrows ncols))) (let ((vec-gen-proc (lambda (k) (if (< k size) (gen-proc (quotient k ncols) (remainder k ncols)) ncols)))) ((vector-generator vec-gen-proc) (add1 size))))))) ; - End Program - ; - Program 9.34, pg. 296 - (define row-of (lambda (mat) (let ((mat-ref (matrix-ref mat)) (number-of-columns (num-cols mat))) (lambda (i) (let ((gen-proc (lambda (j) (mat-ref i j)))) ((vector-generator gen-proc) number-of-columns)))))) ; - End Program - ; - Program 9.35, pg. 296 - (define column-of (lambda (mat) (let ((mat-ref (matrix-ref mat)) (number-of-rows (num-rows mat))) (lambda (j) (let ((gen-proc (lambda (i) (mat-ref i j)))) ((vector-generator gen-proc) number-of-rows)))))) ; - End Program - ; - Program 9.37, pg. 297 - (define matrix-transpose (lambda (mat) (let ((mat-ref (matrix-ref mat))) (let ((gen-proc (lambda (i j) (mat-ref j i)))) ((matrix-generator gen-proc) (num-cols mat) (num-rows mat)))))) ; - End Program - ; - Program 9.38, pg. 299 - (define matrix-product (lambda (mat-a mat-b) (let ((ncols-a (num-cols mat-a)) (a-ref (matrix-ref mat-a)) (b-ref (matrix-ref mat-b))) (if (not (= ncols-a (num-rows mat-b))) (error "matrix-product:" "The matrices are not compatible.") (let ((gen-proc (lambda (i j) (letrec ((loop (lambda (r acc) (if (= r ncols-a) acc (loop (add1 r) (+ acc (* (a-ref i r) (b-ref r j)))))))) (loop 0 0))))) ((matrix-generator gen-proc) (num-rows mat-a) (num-cols mat-b))))))) ; - End Program - ; - Program 9.39, pg. 300 - (define matrix-set! (lambda (mat) (let ((ncols (num-cols mat))) (lambda (i j obj) (vector-set! mat (+ (* i ncols) j) obj))))) ; - End Program -