Mercurial > emacs
diff lisp/subr.el @ 61716:b4f867a07e7f
(assq-delete-all): New implementation that is linear, not quadratic.
Suggested by David Kastrup <dak@gnu.org>.
(rassq-delete-all): New function.
author | Lute Kamstra <lute@gnu.org> |
---|---|
date | Thu, 21 Apr 2005 21:15:51 +0000 |
parents | c95f35bea727 |
children | 994a6fb78d4c |
line wrap: on
line diff
--- a/lisp/subr.el Thu Apr 21 10:31:01 2005 +0000 +++ b/lisp/subr.el Thu Apr 21 21:15:51 2005 +0000 @@ -2376,15 +2376,34 @@ (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.