tabulate; list->vector bug fix

This commit is contained in:
Rolf-Thomas Happe 2003-03-20 19:09:05 +00:00
parent 9ef33b4651
commit 066947bdb2
6 changed files with 88 additions and 36 deletions

View File

@ -38,7 +38,9 @@ vectors= sequences=
* Constructors * Constructors
make-vector make-another-sequence make-absequence/behavior make-vector make-another-sequence make-absequence/behavior
vector absequence/behavior vector
vector-tabulate
absequence/behavior
make-sequence-behavior make-sequence-behavior
make-absequence-record make-absequence-record
@ -57,6 +59,7 @@ subvector subsequence
* Modification * Modification
vector-set! sequence-set! absequence-set! vector-set! sequence-set! absequence-set!
sequence-fill! vector-fill! absequence-fill! sequence-fill! vector-fill! absequence-fill!
sequence-tabulate! vector-tabulate!
* Reverse & Append * Reverse & Append
vector-append sequence-append vector-append sequence-append
@ -218,6 +221,12 @@ of minimal length with the elements S[0] = X0, ...
* *
(vector-tabulate proc len) --> s
Synopsis: Make vector s[0:len) with s[i] := (proc i).
*
(make-sequence-behavior maker predicate getter setter meter) --> sb (make-sequence-behavior maker predicate getter setter meter) --> sb
Synopsis: Package the concrete sequence behaviour (basic procedures Synopsis: Package the concrete sequence behaviour (basic procedures
@ -231,7 +240,7 @@ in the absequence record ABS.
List & Sequence Conversion List & Sequence Conversion
(list->vector xs [sbart end]) --> s (list->vector xs [start end]) --> s
(list->absequence/behavior sb xs [start end]) --> s (list->absequence/behavior sb xs [start end]) --> s
Synopsis: Make a new vector (absequence with sequence-behavior SB) S Synopsis: Make a new vector (absequence with sequence-behavior SB) S
@ -302,6 +311,16 @@ Synopsis: Set s[i] := x for all i in [start:end) etc.
* *
(vector-tabulate! s start proc len) --> s
(sequence-tabulate! s start proc len) --> s
Synopsis: Set s[start+i] := (proc i) for all i in [0:len), return s.
[ Destructive-update analogue to STRING-TABULATE, exceptionally with a
useful return value. ]
*
Reverse & Append Reverse & Append
(vector-append s0 ...) --> s (vector-append s0 ...) --> s

View File

@ -26,6 +26,11 @@
(apply contiguous-sequence-fill! s x opts)))) (apply contiguous-sequence-fill! s x opts))))
(define (sequence-tabulate! s start proc len)
((if (vector? s) vector-tabulate! sequence-tabulate!)
s start proc len))
(define (subsequence s start end) (define (subsequence s start end)
(cond ((vector? s) (cond ((vector? s)
(subvector s start end)) (subvector s start end))

View File

@ -9,6 +9,7 @@
;;; ;;;
;;; sequence->list ;;; sequence->list
;;; sequence-fill! ;;; sequence-fill!
;;; sequence-tabulate!
;;; subsequence ;;; subsequence
;;; sequence-copy ;;; sequence-copy
;;; sequence-append ;;; sequence-append
@ -23,7 +24,7 @@
(define (id x) x) (define (id x) x)
;; seqs : nonempty proper list of sequences ;; seqs : nonempty proper list of sequences
;; compute min sequence-length ;; compute min sequence-length [ for internal use ]
(define (sequences-length seqs) (define (sequences-length seqs)
;; we got the time, we got the space ... ;; we got the time, we got the space ...
(apply min (map sequence-length seqs))) (apply min (map sequence-length seqs)))
@ -47,6 +48,17 @@
(loop (+ i 1))))))) (loop (+ i 1)))))))
(define (sequence-tabulate! s start proc len)
(assert (and (sequence? s)
(procedure? proc)
(<= 0 start (+ start len) (sequence-length s)))
sequence-tabulate!)
(do ((i 0 (+ i 1)))
((= i len) s)
(sequence-set! s (+ start i) (proc i))))
(define (sequence-copy/maker maker s . opts) (define (sequence-copy/maker maker s . opts)
(let-optionals opts ((start 0) (let-optionals opts ((start 0)
(end (sequence-length s))) (end (sequence-length s)))

View File

@ -12,6 +12,7 @@
;; things definable in terms of the basic protocol ;; things definable in terms of the basic protocol
(define-interface sequence-extras-face (define-interface sequence-extras-face
(export sequence->list (export sequence->list
sequence-tabulate!
sequence-fill! sequence-fill!
subsequence subsequence
sequence-copy sequence-copy
@ -52,9 +53,11 @@
;; [ extends the union of SEQUENCE-BASICS- and -EXTRAS-INTERFACE with ;; [ extends the union of SEQUENCE-BASICS- and -EXTRAS-INTERFACE with
;; `VECTOR' replacing `SEQUENCE' ] ;; `VECTOR' replacing `SEQUENCE' ]
(define-interface vector-lib-face (define-interface vector-lib-face
(export ;; std constructors (export ;; constructors and the like
vector
make-vector make-vector
vector
list->vector ; with opts
vector-tabulate
;; basics w/o the vanilla constructor ;; basics w/o the vanilla constructor
vector? vector?
vector-length vector-length
@ -64,6 +67,7 @@
;; extras ;; extras
vector->list vector->list
vector-fill! vector-fill!
vector-tabulate!
subvector subvector
vector-copy vector-copy
vector-append vector-append

View File

@ -48,7 +48,7 @@
(open krims ; assert (open krims ; assert
util ; unspecific util ; unspecific
let-opt ; let-optionals [ from scsh ] let-opt ; let-optionals [ from scsh ]
srfi-1+ ; append! first rest srfi-1+ ; append! drop first rest
scheme) scheme)
;; bind the basic operations to vector specialists ;; bind the basic operations to vector specialists
(begin (begin
@ -58,36 +58,9 @@
(define sequence-set! vector-set!) (define sequence-set! vector-set!)
(define (make-another-sequence v k . maybe-fill) (define (make-another-sequence v k . maybe-fill)
(apply make-vector k maybe-fill))) (apply make-vector k maybe-fill)))
(files genseqs) (files genseqs ; generic code
;; rename extras not supplied by scheme and def list->vector with opts vecnames) ; renames stuff, defines constructors
(begin )
(define subvector subsequence)
(define vector-copy sequence-copy)
(define vector-fill! sequence-fill!) ; with opt. start & end
(define vector-append sequence-append)
(define vector-map sequence-map)
(define vector-for-each sequence-for-each)
(define vector-fold sequence-fold)
(define vector-fold-right sequence-fold-right)
(define vector-any sequence-any)
(define vector-every sequence-every)
(define vector= sequence=)
(define vectors-map sequences-map)
(define vectors-for-each sequences-for-each)
(define vectors-fold sequences-fold)
(define vectors-fold-right sequences-fold-right)
(define vectors-any sequences-any)
(define vectors-every sequences-every)
(define vectors= sequences=)
(define (list->vector xs . opts)
(let-optionals opts ((start 0) (end (length xs)))
(assert (<= 0 start end))
(let ((v (make-vector (- end start))))
(do ((i start (+ i 1))
(ys xs (rest ys)))
((= i end) v)
(vector-set! v (- i start) (first ys))))))
))
;; elementary and other general sequence operations, typically dispatching ;; elementary and other general sequence operations, typically dispatching

View File

@ -0,0 +1,39 @@
; Copyright (c) 2003 RT Happe <rthappe at web de>
; See the file COPYING distributed with the Scheme Untergrund Library
;;; `vector names' for the sequence procedures specialised to vectors, and
;;; some constructors or the like: list->vector vector-tabulate
(define subvector subsequence)
(define vector-copy sequence-copy)
(define vector-fill! sequence-fill!) ; with opt. start & end
(define vector-tabulate! sequence-tabulate!)
(define vector-append sequence-append)
(define vector-map sequence-map)
(define vector-for-each sequence-for-each)
(define vector-fold sequence-fold)
(define vector-fold-right sequence-fold-right)
(define vector-any sequence-any)
(define vector-every sequence-every)
(define vector= sequence=)
(define vectors-map sequences-map)
(define vectors-for-each sequences-for-each)
(define vectors-fold sequences-fold)
(define vectors-fold-right sequences-fold-right)
(define vectors-any sequences-any)
(define vectors-every sequences-every)
(define vectors= sequences=)
;; redefine with opts
(define (list->vector xs . opts)
(let-optionals opts ((start 0) (end (length xs)))
(assert (<= 0 start end))
(let ((v (make-vector (- end start))))
(do ((i start (+ i 1))
(ys (drop xs start) (rest ys)))
((= i end) v)
(vector-set! v (- i start) (first ys))))))
(define (vector-tabulate proc len)
(vector-tabulate! (make-vector len) 0 proc len))