emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5ad8f3e570 1/3: Use `take` where clearly safe to do so (bug#56521


From: Mattias Engdegård
Subject: master 5ad8f3e570 1/3: Use `take` where clearly safe to do so (bug#56521)
Date: Mon, 18 Jul 2022 07:00:43 -0400 (EDT)

branch: master
commit 5ad8f3e5709a3823371ea6aa039b5e7e50feca1f
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    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)).
---
 lisp/auth-source.el     |  4 ++--
 lisp/emacs-lisp/seq.el  | 12 +++++++-----
 lisp/gnus/message.el    |  3 +--
 lisp/net/dbus.el        |  4 +---
 lisp/replace.el         |  5 ++---
 test/src/print-tests.el |  2 +-
 6 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index 12da2c3d73..a802ef856d 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -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)))
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 36c17f4cd5..0d9483aecb 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -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."
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 7c2b24c6ee..00a27fb5f5 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -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)))
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
index d4d4ed54e9..6c978c5a5f 100644
--- a/lisp/net/dbus.el
+++ b/lisp/net/dbus.el
@@ -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.
diff --git a/lisp/replace.el b/lisp/replace.el
index 54ee64f64a..f8cc784f7c 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -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")))
 
diff --git a/test/src/print-tests.el b/test/src/print-tests.el
index 6ff7e99783..f818b4d471 100644
--- a/test/src/print-tests.el
+++ b/test/src/print-tests.el
@@ -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)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]