From: Richard M. Stallman Date: Tue, 26 Apr 1994 07:43:54 +0000 (+0000) Subject: (run-hooks): Don't use mapcar--save consing. X-Git-Tag: emacs-19.34~8743 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e8976c8a2c6bc87470e1e8442227755b0db1ed15;p=emacs.git (run-hooks): Don't use mapcar--save consing. (run-hook-with-args): New function. --- diff --git a/lisp/subr.el b/lisp/subr.el index 6da51773429..760d1edc22d 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -491,10 +491,31 @@ If it is a list, the elements are called, in order, with no arguments." (symbol-value sym) (let ((value (symbol-value sym))) (if (and (listp value) (not (eq (car value) 'lambda))) - (mapcar 'funcall value) + (let ((functions value)) + (while value + (funcall (car value)) + (setq value (cdr value)))) (funcall value))))) (setq hooklist (cdr hooklist)))) +(defun run-hook-with-args (hook &rest args) + "Run HOOK with the specified arguments ARGS. +HOOK should be a symbol, a hook variable. If HOOK has a non-nil +value, that value may be a function or a list of functions to be +called to run the hook. If the value is a function, it is called with +the given arguments and its return value is returned. If it is a list +of functions, those functions are called, in order, +with the given arguments ARGS. +It is best not to depend on the value return by `run-hook-with-args', +as that may change." + (and (boundp hook) + (symbol-value hook) + (let ((value (symbol-value hook))) + (if (and (listp value) (not (eq (car value) 'lambda))) + (mapcar '(lambda (foo) (apply foo args)) + value) + (apply value args))))) + ;; Tell C code how to call this function. (defconst run-hooks 'run-hooks "Variable by which C primitives find the function `run-hooks'.