summaryrefslogtreecommitdiff
path: root/module/srfi
diff options
context:
space:
mode:
authorDaniel Llorens <lloda@sarc.name>2021-08-05 19:43:21 +0200
committerDaniel Llorens <lloda@sarc.name>2021-08-06 13:06:51 +0200
commita34c762de0cda0fdd56fd582de0cdc71eab2116e (patch)
tree1eeeb8b6814b6ae50505326ea160038ae981fbb8 /module/srfi
parentbfda8d397251cdb88bf1e775c85c41a4d01061ac (diff)
downloadguile-a34c762de0cda0fdd56fd582de0cdc71eab2116e.tar.gz
Extend core vector-copy to r7rs vector-copy
* libguile/vectors.h: Declare scm_vector_copy_partial. * libguile/vectors.c (scm_vector_copy_partial): As stated. (scm_vector_copy): Reuse scm_vector_copy_partial. * module/scheme/base.scm: Reuse core vector-copy. * module/srfi/srfi-43: Reuse core vector-copy. * test-suite/tests/vectors.test: Test vector-copy.
Diffstat (limited to 'module/srfi')
-rw-r--r--module/srfi/srfi-43.scm26
1 files changed, 11 insertions, 15 deletions
diff --git a/module/srfi/srfi-43.scm b/module/srfi/srfi-43.scm
index eb6d8c317..f8e38e27c 100644
--- a/module/srfi/srfi-43.scm
+++ b/module/srfi/srfi-43.scm
@@ -204,7 +204,6 @@ error for the number of seeds to vary between iterations."
(define guile-vector-copy (@ (guile) vector-copy))
-;; TODO: Enhance Guile core 'vector-copy' to do this.
(define vector-copy
(case-lambda*
"(vector-copy vec [start [end [fill]]]) -> vector
@@ -217,23 +216,20 @@ VEC, the slots in the new vector that obviously cannot be filled by
elements from VEC are filled with FILL, whose default value is
unspecified."
((v) (guile-vector-copy v))
- ((v start)
- (assert-vector v 'vector-copy)
- (let ((len (vector-length v)))
- (assert-valid-start start len 'vector-copy)
- (let ((result (make-vector (- len start))))
- (vector-move-left! v start len result 0)
- result)))
+ ((v start) (guile-vector-copy v start))
((v start end #:optional (fill *unspecified*))
(assert-vector v 'vector-copy)
(let ((len (vector-length v)))
- (unless (and (exact-integer? start)
- (exact-integer? end)
- (<= 0 start end))
- (error-from 'vector-copy "invalid index range" start end))
- (let ((result (make-vector (- end start) fill)))
- (vector-move-left! v start (min end len) result 0)
- result)))))
+ (if (<= end len)
+ (guile-vector-copy v start end)
+ (begin
+ (unless (and (exact-integer? start)
+ (exact-integer? end)
+ (<= 0 start end))
+ (error-from 'vector-copy "invalid index range" start end))
+ (let ((result (make-vector (- end start) fill)))
+ (vector-move-left! v start (min end len) result 0)
+ result)))))))
(define vector-reverse-copy
(let ()