summaryrefslogtreecommitdiff
path: root/module/srfi
diff options
context:
space:
mode:
authorDaniel Llorens <lloda@sarc.name>2019-12-18 14:31:39 +0100
committerDaniel Llorens <lloda@sarc.name>2020-01-03 13:01:04 +0100
commitddad8ae05adfdb84ef80cb2d2730e73f4d27c74b (patch)
treea0e6b848a8aa82edcb649f5291d6008f38f5dc68 /module/srfi
parent6b0491233f6b7e3ca2743ec43340a2ed04ac845e (diff)
downloadguile-ddad8ae05adfdb84ef80cb2d2730e73f4d27c74b.tar.gz
Extend core vector-fill! to handle a range
With this patch, these two lines (vector-fill! vec fill) (vector-fill! vec fill 0 end) run at the same speed; before, the second one was much slower. This patch also makes it an error to call vector-fill! with a non-vector array. The previous implementation did not work correctly in this case. * libguile/vectors.c (SCM_VALIDATE_MUTABLE_VECTOR): Better error message. (vector-fill!): Handle optional arguments start, end. Do not attempt to handle non-vector arrays. Rename the C binding to scm_vector_fill_partial_x. (scm_vector_fill_x): Reuse scm_vector_fill_partial_x. * module/srfi/srfi-43.scm (vector-fill!): Remove & re-export the core version instead.
Diffstat (limited to 'module/srfi')
-rw-r--r--module/srfi/srfi-43.scm32
1 files changed, 2 insertions, 30 deletions
diff --git a/module/srfi/srfi-43.scm b/module/srfi/srfi-43.scm
index e1bf19e9d..eb6d8c317 100644
--- a/module/srfi/srfi-43.scm
+++ b/module/srfi/srfi-43.scm
@@ -22,8 +22,8 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-8)
#:re-export (make-vector vector vector? vector-ref vector-set!
- vector-length)
- #:replace (vector-copy vector-fill! list->vector vector->list)
+ vector-length vector-fill!)
+ #:replace (vector-copy list->vector vector->list)
#:export (vector-empty? vector= vector-unfold vector-unfold-right
vector-reverse-copy
vector-append vector-concatenate
@@ -872,34 +872,6 @@ Swap the values of the locations in VEC at I and J."
(vector-set! vec i (vector-ref vec j))
(vector-set! vec j tmp))))
-;; TODO: Enhance Guile core 'vector-fill!' to do this.
-(define vector-fill!
- (let ()
- (define guile-vector-fill!
- (@ (guile) vector-fill!))
- (define (%vector-fill! vec fill start end)
- (let loop ((i start))
- (when (< i end)
- (vector-set! vec i fill)
- (loop (+ i 1)))))
- (case-lambda
- "(vector-fill! vec fill [start [end]]) -> unspecified
-
-Assign the value of every location in VEC between START and END to
-FILL. START defaults to 0 and END defaults to the length of VEC."
- ((vec fill)
- (guile-vector-fill! vec fill))
- ((vec fill start)
- (assert-vector vec 'vector-fill!)
- (let ((len (vector-length vec)))
- (assert-valid-start start len 'vector-fill!)
- (%vector-fill! vec fill start len)))
- ((vec fill start end)
- (assert-vector vec 'vector-fill!)
- (let ((len (vector-length vec)))
- (assert-valid-range start end len 'vector-fill!)
- (%vector-fill! vec fill start end))))))
-
(define (%vector-reverse! vec start end)
(let loop ((i start) (j (- end 1)))
(when (< i j)