aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mendler <mail@daniel-mendler.de>2024-05-17 21:44:30 +0200
committerDaniel Mendler <mail@daniel-mendler.de>2024-05-17 21:44:30 +0200
commite8c9f3bbd38a4d045b75cfde7669f5e2efe30bd8 (patch)
treeae09e65bf56a44883fe9005cf240ec55b4ef63de
parentd59333f9a19daf153cb22f691e156420b50f8efa (diff)
sort: Fix handling of :reverse argument
-rw-r--r--compat-30.el19
1 files changed, 8 insertions, 11 deletions
diff --git a/compat-30.el b/compat-30.el
index 6c5db9e..edbfd9a 100644
--- a/compat-30.el
+++ b/compat-30.el
@@ -310,29 +310,26 @@ The following arguments are defined:
For compatibility, the calling convention (sort SEQ LESSP) can also be used;
in this case, sorting is always done in-place."
:extended t
- (let ((in-place t) (orig-seq seq))
+ (let ((in-place t) (reverse nil) (orig-seq seq))
(when (or (not lessp) rest)
(setq
rest (if lessp (cons lessp rest) rest)
in-place (plist-get rest :in-place)
+ reverse (plist-get rest :reverse)
lessp (let ((key (plist-get rest :key))
- (reverse (plist-get rest :reverse))
(< (or (plist-get rest :lessp) #'value<)))
- (cond
- ((and key reverse)
- (lambda (a b) (not (funcall < (funcall key a) (funcall key b)))))
- (key
- (lambda (a b) (funcall < (funcall key a) (funcall key b))))
- (reverse
- (lambda (a b) (not (funcall < a b))))
- (t <)))
+ (if key
+ (lambda (a b) (funcall < (funcall key a) (funcall key b)))
+ <))
seq (if (or (eval-when-compile (< emacs-major-version 25)) in-place)
seq
(copy-sequence seq))))
;; Emacs 24 does not support vectors. Convert to list.
(when (and (eval-when-compile (< emacs-major-version 25)) (vectorp seq))
(setq seq (append seq nil)))
- (setq seq (sort seq lessp))
+ (setq seq (if reverse
+ (nreverse (sort (nreverse seq) lessp))
+ (sort seq lessp)))
;; Emacs 24: Convert back to vector.
(if (and (eval-when-compile (< emacs-major-version 25)) (vectorp orig-seq))
(if in-place