summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
Diffstat (limited to 'mew.scm')
-rw-r--r--mew.scm17
1 files changed, 16 insertions, 1 deletions
diff --git a/mew.scm b/mew.scm
index d0de5e0..70bcff6 100644
--- a/mew.scm
+++ b/mew.scm
@@ -19,7 +19,7 @@
      per pop! prn proj push! puts
      rand range rep repeat
      sample scan scan-right sing? search seq set set-at sgn
-     shuffle shuffle! sort sort! str slurp
+     shuffle shuffle! sort sort-by sort! str slurp
      tally-accumulator tbl time
      while
      uniq-accumulator unlist until
@@ -1361,6 +1361,21 @@
                     (chicken-sort! xs less?)
                     (error "can only sort! vectors")))))
 
+  (define sort-by
+    (case-lambda
+      ((sequence transform) (sort-by sequence transform <?))
+      ((sequence transform less?)
+       (let ((t (tbl)))
+         (define (cached k)
+           (hash-table-ref t k
+                           (lambda ()
+                             (let ((v (transform k)))
+                               (hash-table-set! t k v)
+                               v))))
+         (sort sequence (lambda (a b)
+                          (less? (cached a) (cached b))))))))
+
+
   (let ((old-repl-prompt (repl-prompt)))
     (repl-prompt (lambda ()
                    (let ((old-prompt (old-repl-prompt)))