1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-05 22:20:24 -08:00

Use take where clearly safe to do so (bug#56521)

* lisp/emacs-lisp/seq.el (seq-take):
* lisp/auth-source.el (auth-source-secrets-search)
(auth-source-plstore-search):
* lisp/gnus/message.el (message-insert-formatted-citation-line):
* lisp/net/dbus.el (dbus-unregister-object):
* lisp/replace.el (occur-context-lines):
* test/src/print-tests.el (print-circular): Replace hand-written loop
or `butlast` call with `take` for clarity, performance and validation.
We have the equivalence
(take N LIST) = (butlast LIST (- (length LIST) N)).
This commit is contained in:
Mattias Engdegård 2022-07-17 19:05:03 +02:00
parent 2d97fe2710
commit 5ad8f3e570
6 changed files with 14 additions and 16 deletions

View file

@ -1622,7 +1622,7 @@ authentication tokens:
(not (string-match label item)))
collect item)))
;; TODO: respect max in `secrets-search-items', not after the fact
(items (butlast items (- (length items) max)))
(items (take max items))
;; convert the item name to a full plist
(items (mapcar (lambda (item)
(append
@ -2080,7 +2080,7 @@ entries for git.gnus.org:
search-keys)))
(items (plstore-find store search-spec))
(item-names (mapcar #'car items))
(items (butlast items (- (length items) max)))
(items (take max items))
;; convert the item to a full plist
(items (mapcar (lambda (item)
(let* ((plist (copy-tree (cdr item)))

View file

@ -587,11 +587,13 @@ Signal an error if SEQUENCE is empty."
(cl-defmethod seq-take ((list list) n)
"Optimized implementation of `seq-take' for lists."
(let ((result '()))
(while (and list (> n 0))
(setq n (1- n))
(push (pop list) result))
(nreverse result)))
(if (eval-when-compile (fboundp 'take))
(take n list)
(let ((result '()))
(while (and list (> n 0))
(setq n (1- n))
(push (pop list) result))
(nreverse result))))
(cl-defmethod seq-drop-while (pred (list list))
"Optimized implementation of `seq-drop-while' for lists."

View file

@ -4180,8 +4180,7 @@ See `message-citation-line-format'."
(setq fname (car names)
lname (string-join (cdr names) " ")))
((> count 3)
(setq fname (string-join (butlast names (- count 2))
" ")
(setq fname (string-join (take 2 names) " ")
lname (string-join (nthcdr 2 names) " "))))
(when (string-match "\\(.*\\),\\'" fname)
(let ((newlname (match-string 1 fname)))

View file

@ -941,9 +941,7 @@ association to the service from D-Bus."
;; Loop over the registered functions.
(dolist (elt entry)
(when (equal
value
(butlast (cdr elt) (- (length (cdr elt)) (length value))))
(when (equal value (take (length value) (cdr elt)))
(setq ret t)
;; Compute new hash value. If it is empty, remove it from the
;; hash table.

View file

@ -2437,9 +2437,8 @@ See also `multi-occur'."
(if (>= (+ prev-line (length prev-after-lines))
(- curr-line (length before-lines)))
(setq prev-after-lines
(butlast prev-after-lines
(- (length prev-after-lines)
(- curr-line prev-line (length before-lines) 1))))
(take (- curr-line prev-line (length before-lines) 1)
prev-after-lines))
;; Separate non-overlapping context lines with a dashed line.
(setq separator "-------\n")))

View file

@ -514,7 +514,7 @@ otherwise, use a different charset."
(should (< lead (length numbers)))
(should (<= lead loopback-index))
(should (< loopback-index (length numbers)))
(let ((lead-part (butlast numbers (- (length numbers) lead)))
(let ((lead-part (take lead numbers))
(loop-part (nthcdr lead numbers)))
;; The lead part must match exactly.
(should (equal lead-part (number-sequence 1 lead)))