Change list->string to take optional start and end args.
authorChris Hanson <org/chris-hanson/cph>
Tue, 19 Nov 2019 06:47:50 +0000 (22:47 -0800)
committerChris Hanson <org/chris-hanson/cph>
Wed, 20 Nov 2019 03:06:01 +0000 (19:06 -0800)
This extension matches SRFI 140.

src/runtime/string.scm

index 660da8ec5da450faf1dcb361cc5636b80ba6ac58..a113e298544f4a8c0674b8a65bffc924122c0c6e 100644 (file)
@@ -1726,12 +1726,16 @@ USA.
 \f
 ;;;; Sequence converters
 
-(define (list->string chars)
-  (let ((builder (string-builder)))
-    (for-each (lambda (char)
-               (guarantee char? char 'list->string)
-               (builder char))
-             chars)
+(define (list->string chars #!optional start end)
+  (let* ((end (fix:end-index end (length chars) 'list->string))
+        (start (fix:start-index start end 'list->string))
+        (n (fix:- end start))
+        (builder (string-builder n)))
+    (do ((i 0 (fix:+ i 1))
+        (chars (list-tail chars start) (cdr chars)))
+       ((not (fix:< i n)))
+      (guarantee char? (car chars) 'list->string)
+      (builder (car chars)))
     (builder 'immutable)))
 
 (define (string->list string #!optional start end)
@@ -1753,7 +1757,7 @@ USA.
 (define (vector->string vector #!optional start end)
   (let* ((end (fix:end-index end (vector-length vector) 'vector->string))
         (start (fix:start-index start end 'vector->string))
-        (builder (string-builder)))
+        (builder (string-builder (fix:- end start))))
     (do ((i start (fix:+ i 1)))
        ((not (fix:< i end)))
       (let ((char (vector-ref vector i)))