# HG changeset patch # User Lute Kamstra # Date 1114118151 0 # Node ID b4f867a07e7fdd40d925ea01d5e30ac437b67904 # Parent d14be7e6378f73ed83c2bc1d695da084b6c6b734 (assq-delete-all): New implementation that is linear, not quadratic. Suggested by David Kastrup . (rassq-delete-all): New function. diff -r d14be7e6378f -r b4f867a07e7f lisp/subr.el --- 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.