diff options
| author | Daniel Mendler <mail@daniel-mendler.de> | 2024-05-17 21:44:30 +0200 |
|---|---|---|
| committer | Daniel Mendler <mail@daniel-mendler.de> | 2024-05-17 21:44:30 +0200 |
| commit | e8c9f3bbd38a4d045b75cfde7669f5e2efe30bd8 (patch) | |
| tree | ae09e65bf56a44883fe9005cf240ec55b4ef63de | |
| parent | d59333f9a19daf153cb22f691e156420b50f8efa (diff) | |
sort: Fix handling of :reverse argument
| -rw-r--r-- | compat-30.el | 19 |
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 |
