Mercurial > emacs
changeset 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 | cd50dfa70bb2 |
children | d29091c19e81 |
files | lisp/subr.el |
diffstat | 1 files changed, 16 insertions(+), 10 deletions(-) [+] |
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.