summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
Diffstat (limited to 'mew.scm')
-rw-r--r--mew.scm15
1 files changed, 13 insertions, 2 deletions
diff --git a/mew.scm b/mew.scm
index 695568b..22a8752 100644
--- a/mew.scm
+++ b/mew.scm
@@ -17,7 +17,8 @@
      odometer one-of op op*
      per prn proj puts
      rand range rep
-     sample scan scan-right sing? search seq set set-at shuffle str slurp
+     sample scan scan-right sing? search seq set set-at
+     shuffle shuffle! str slurp
      tally-accumulator tbl time
      while
      uniq-accumulator unlist until
@@ -404,7 +405,7 @@
       ((n)   (pseudo-random-integer n))
       ((n m) (+ n (pseudo-random-integer (- m n))))))
 
-  (define (shuffle v)
+  (define (shuffle! v)
     (let loop ((i (- (vector-length v) 1)))
       (when (positive? i)
         (let* ((j (rand (+ i 1)))
@@ -415,6 +416,16 @@
           (loop (dec i)))))
     v)
 
+  (define (shuffle v)
+    (let ((l (vector-length v)))
+      (do ((res (make-vector l))
+           (i 0 (+ i 1)))
+          ((= i l) res)
+        (let ((j (rand (+ i 1))))
+          (unless (= j i)
+            (vector-set! res i (vector-ref res j)))
+          (vector-set! res j (vector-ref v i))))))
+
   (define (sample o)
     (if (hash-table? o)
       (esc ret