]> git.eshelyaron.com Git - emacs.git/commitdiff
(assq-delete-all): New implementation that is linear, not quadratic.
authorLute Kamstra <lute@gnu.org>
Thu, 21 Apr 2005 21:18:29 +0000 (21:18 +0000)
committerLute Kamstra <lute@gnu.org>
Thu, 21 Apr 2005 21:18:29 +0000 (21:18 +0000)
Suggested by David Kastrup <dak@gnu.org>.
(rassq-delete-all): New function.

lisp/ChangeLog
lisp/subr.el

index d4a67928ab7e08713f43ef85e3aae2011ea48731..e242caae13fd2fff55d730c2d8be4e2c248ae1a8 100644 (file)
@@ -1,5 +1,9 @@
 2005-04-21  Lute Kamstra  <lute@gnu.org>
 
+       * subr.el (assq-delete-all): New implementation that is linear,
+       not quadratic.  Suggested by David Kastrup <dak@gnu.org>.
+       (rassq-delete-all): New function.
+
        * menu-bar.el (menu-bar-options-save, menu-bar-showhide-menu): Add
        size-indication-mode.
 
index 7330f1d6ddf0a4c2d237ee42da7042bf00dea618..f791faffd910de75b87427341334a6b8f58067fc 100644 (file)
@@ -2376,15 +2376,34 @@ macros."
       (eq (car-safe object) 'lambda)))
 
 (defun assq-delete-all (key alist)
-  "Delete from ALIST all elements whose car is KEY.
+  "Delete from ALIST all elements whose car is `eq' to KEY.
 Return the modified alist.
 Elements of ALIST that are not conses are ignored."
-  (let ((tail alist))
-    (while tail
-      (if (and (consp (car tail)) (eq (car (car tail)) key))
-         (setq alist (delq (car tail) alist)))
-      (setq tail (cdr tail)))
-    alist))
+  (while (and (consp (car alist)) 
+             (eq (car (car alist)) key))
+    (setq alist (cdr alist)))
+  (let ((tail alist) tail-cdr)
+    (while (setq tail-cdr (cdr tail))
+      (if (and (consp (car tail-cdr))
+              (eq (car (car tail-cdr)) key))
+         (setcdr tail (cdr tail-cdr))
+       (setq tail tail-cdr))))
+  alist)
+
+(defun rassq-delete-all (value alist)
+  "Delete from ALIST all elements whose cdr is `eq' to VALUE.
+Return the modified alist.
+Elements of ALIST that are not conses are ignored."
+  (while (and (consp (car alist)) 
+             (eq (cdr (car alist)) value))
+    (setq alist (cdr alist)))
+  (let ((tail alist) tail-cdr)
+    (while (setq tail-cdr (cdr tail))
+      (if (and (consp (car tail-cdr))
+              (eq (cdr (car tail-cdr)) value))
+         (setcdr tail (cdr tail-cdr))
+       (setq tail tail-cdr))))
+  alist)
 
 (defun make-temp-file (prefix &optional dir-flag suffix)
   "Create a temporary file.