Subject: bug#47992: 27; 28; Phase out use of `equal` in `add-hook`, `remove-hook`

From: Michael Heerdegen <[email-masked]>
Date: Mon, 05 Jul 2021 01:15:25 +0200

Lars Ingebrigtsen <[email-masked]> writes:

> Some other languages have the ability to add names to anonymous
> functions (yes, a contradiction in terms) to aid debugging and the like.
> We could also extend our `lambda' with an optional name -- it seems like
> that could be generally useful beyond this particular use case -- and
> then this new add-hook function could refuse to accept name-less
> lambdas...

BTW, I think you can have something like that by misusing advice,
e.g. (example at the end):

#+begin_src emacs-lisp
(defalias 'function-name-advice #'identity) ;just a tag

(defun named-function (f name)
  (unless (and (functionp f)
               (not (symbolp f)))
    (error "Not an anonymous function"))
  (when (advice-function-member-p 'function-name-advice f)
    (error "Already has a name"))
  (add-function :filter-return (var f) 'function-name-advice `((name . ,name)))
  f)

(defun function-name (f)
  (and (advice-function-member-p 'function-name-advice f)
       (cdr (assoc 'name (advice--props f)))))

;; Example:
(setq my-test-lambda (lambda (n) (+ 2 n)))
(setq my-named-test-lambda
      (named-function my-test-lambda "Moon Child")) ;; => [bytecode lambda]

(funcall my-named-test-lambda 3) ;; => 5 (works)

(function-name my-named-test-lambda) ;; => "Moon Child"
#+end_src

Michael.