(define make-array (lambda (dimension) (let ((array (make-vector (+ dimension 1)))) (vector-set! array 0 '*array*) array))) (define array? (lambda (x) (and (vector? x) (eq? (vector-ref x 0) '*array*)))) (define array-ref (lambda (array index) (vector-ref array (+ index 1)))) (define array-set! (lambda (array index value) (vector-set! array (+ index 1) value))) (define array-whole-set! (lambda (dest-array source-array) (let ((source-len (vector-length source-array))) (letrec ((loop (lambda (n) (if (< n source-len) (begin (vector-set! dest-array n (vector-ref source-array n)) (loop (+ n 1))))))) (loop 1))))) (define array-copy (lambda (array) (let ((new-array (make-array (- (vector-length array) 1)))) (array-whole-set! new-array array) new-array)))