core: Optimize vector-map, vector-for-each.
[mes.git] / module / srfi / srfi-43.mes
index d7c84f7f5d6423ca37fc639ec53edc2701bbe155..df3c3a6a32c5c5370d2be3ea80e78137a7487fe8 100644 (file)
@@ -1,7 +1,7 @@
 ;;; -*-scheme-*-
 
 ;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of Mes.
 ;;;
 ;;; Code:
 
 (define (vector-map f v)
-  (list->vector (map f (iota (vector-length v)) (vector->list v))))
+  (let* ((k (vector-length v))
+         (n (core:make-vector k)))
+    (let loop ((i 0))
+      (if (= i k) n
+          (begin
+            (vector-set! n i (f i (vector-ref v i)))
+            (loop (+ i 1)))))))
 
 (define (vector-for-each f v)
-  (for-each f (iota (vector-length v)) (vector->list v)))
+  (let ((k (vector-length v)))
+    (let loop ((i 0))
+      (if (< i k)
+          (begin
+            (f i (vector-ref v i))
+            (loop (+ i 1)))))))