vector-map

oku@sandbox ~/proj $ cat check.scm
(import (rnrs))

(let ((v (make-vector (* 1024 1024) 0)))
  (display (vector-length (vector-map (lambda (n) (+ n 1)) v))))
oku@sandbox ~/proj $ time mosh check.scm
CALL: stack expansion
(中略)
1048576
real    0m2.906s
user    0m2.012s
sys     0m0.809s
oku@sandbox ~/proj $ time ypsilon --heap-limit=256 check.scm
1048576
real    0m0.922s
user    0m1.396s
sys     0m0.296s

ちょっと書き換えるとほぼ同じになる。

oku@sandbox ~/proj $ cat check.scm
(import (rnrs))

(define (myvector-map proc v)
  (let* ((len (vector-length v))
         (nv (make-vector len)))
    (define (itr x)
      (if (= len x)
        nv
        (begin
          (vector-set! nv x (proc (vector-ref v x)))
          (itr (+ x 1)))))
    (itr 0)))

(let ((v (make-vector (* 1024 1024) 0)))
  (display (vector-length (myvector-map (lambda (n) (+ 1 n)) v))))
oku@sandbox ~/proj $ time mosh check.scm
1048576
real    0m0.261s
user    0m0.210s
sys     0m0.047s
oku@sandbox ~/proj $ time ypsilon --heap-limit=256 check.scm
1048576
real    0m0.188s
user    0m0.164s
sys     0m0.039s