[plt-scheme] Some things about the Vector type that are not mentioned in normal documention

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Nov 27 17:00:07 EST 2004

On Nov 27, 2004, at 4:19 PM, Devlin Bentley wrote:

> As a new user to Scheme, I recently tried to implement a 2D array as a
> vector of vectors in PltScheme.  Obviously things did not go well for
> me (I used Make-Vector and I filled the vector with another set of
> vectors.)
> Now nowheres in the included documentation, t-y-scheme or the PLT
> MzScheme language manual, is anything mentioned about this being an,
> ...., issue.

As Robby points out and explains, it isn't an issue and therefore 
doesn't deserver mentioning. You would get the same result in any 
programming language, be that C or Java or Prolog or Haskell (lazy 
means you save a reference to this inner vector). Every function call 
evaluates all arguments. Some languages offer syntax that looks like a 
function call but is really not and duplicates things for you. So you 
should be grateful for the lesson. You have finally understood the 
essence of call-by-value in a world with compound objects.

As for your problem, you may wish to consider two different solutions:

  ;; Nat Nat (Nat Nat -> X) -> Matrix[X]
  (define (build-matrix n m f)
    (build-vector n (lambda (i) (build-vector m (lambda (j) (f i j))))))

  ;; Matrix[X] Nat Nat -> X
  (define (matrix-ref M i j)
     (vector-ref (vector-ref M i) j)))
  ;; suitable dimension check omitted


  ;; Nat Nat (Nat Nat -> X) -> Matrix[X]
  (define (build-matrix n m f)
    (list->vector (apply append (build-list n (lambda (i) (build-list m 
(lambda (j) (f i j))))))))

with a suitable deferencing schema. It's much faster than the first one.

-- Matthias

Posted on the users mailing list.