diff lisp/subr.el @ 22959:73a21b5f9bd8

(assoc-default): Rewrite not to use dolist.
author Richard M. Stallman <rms@gnu.org>
date Sat, 08 Aug 1998 23:07:06 +0000
parents 349fa4ee1f27
children d29091c19e81
line wrap: on
line diff
--- a/lisp/subr.el	Sat Aug 08 22:22:56 1998 +0000
+++ b/lisp/subr.el	Sat Aug 08 23:07:06 1998 +0000
@@ -94,17 +94,23 @@
       (setq x (cdr x)))
     x))
 
-(defun assoc-default (el alist test default)
-  "Find object EL in a pseudo-alist ALIST.
-ALIST is a list of conses or objects.  Each element (or the element's
-car, if it. is a cons) is compared with EL by calling TEST.
-If TEST returns non-nil, the element matches;
-then `assoc-default' returns the cdr of the element (if it is a cons),
+(defun assoc-default (key alist &optional test default)
+  "Find object KEY in a pseudo-alist ALIST.
+ALIST is a list of conses or objects.  Each element (or the element's car,
+if it is a cons) is compared with KEY by evaluating (TEST (car elt) KEY).
+If that is non-nil, the element matches;
+then `assoc-default' returns the element's cdr, if it is a cons,
 or DEFAULT if the element is not a cons.
-If no element matches, the value is nil."
-  (dolist (rr alist)
-    (when (funcall test el (if (consp rr) (car rr) rr))
-      (return (if (consp rr) (cdr rr) default)))))
+
+If no element matches, the value is nil.
+If TEST is omitted or nil, `equal' is used."
+  (let (found (tail alist) value)
+    (while (and tail (not found))
+      (let ((elt (car tail)))
+	(when (funcall (or test 'equal) (if (consp elt) (car elt) elt) key)
+	  (setq found t value (if (consp elt) (cdr elt) default))))
+      (setq tail (cdr tail)))
+    value))
 
 ;;;; Keymap support.