;;; $Id: vector-generator-mod.scm,v 1.2 2006/01/05 22:24:09 leavens Exp $ ;;; Springer-Friedman, Program 9.21, pg. 283 - (module vector-generator-mod (lib "typedscm.ss" "typedscm") (provide vector-generator) (deftype add1 (-> (number) number)) (define add1 (lambda (n) (+ 1 n))) (deftype vector-generator (forall (T) (-> ((-> (number) T)) (-> (number) (vector-of T))))) (define vector-generator (lambda (gen-proc) (lambda (size) ;; ENSURES: result is a new vector of elements indexed 0...size-1 ;; such that the ith element is (gen-proc i). Note that the calls ;; to gen-proc are made in order from 0 to size-1. (let ((vec (make-vector size))) (letrec ((loop ; TYPE: integer -> void (lambda (i) ;; REQUIRES: 0 <= i <= size and for all 0 <= j < i, ;; (vector-ref vec j) = (gen-proc j) ;; MODIFIES: vec ;; EFFECT: initialize indexes i up to size-1 (if (< i size) (begin (vector-set! vec i (gen-proc i)) (loop (add1 i))))))) (loop 0)) vec)))) ) ; end module