Pregunta:
Estoy explorando opciones para parchear monos y me pregunto si lo siguiente está dentro de lo razonable.
Me gustaría anular una función en particular dentro de alguna función de destino para que las llamadas dentro de la función de destino se anulen, pero las funciones llamadas directamente por la función de destino no se vean afectadas. Si la función invalidada hereda la invalidación no es particularmente importante.
(require 'noflet)
(defun my-message (msg)
(message (concat "**" msg "**")))
(defun unaffected-fn ()
(my-message "Goodbye!"))
(defun target-fn ()
(my-message "Hello!")
(unaffected-fn))
(noflet ((my-message (msg) (message (concat "@@" msg "@@"))))
(target-fn))
El resultado de este código es:
@@Hello!@@
@@Goodbye!@@
Me gustaría evitar que no unaffected-fn
herede esta anulación local. El resultado del comportamiento deseado sería:
@@Hello!@@
**Goodbye!**
Se agradecen las sugerencias para una redacción más clara de esta pregunta.
Respuesta:
Quizás no indicó el problema completo que desea resolver. Pero basándose únicamente en su descripción, existen formas más sencillas de manejarlo. Me vienen a la mente dos obvios (ver más abajo). Es posible que desee especificar su problema con más detalle, indicando por qué, por ejemplo, estos enfoques obvios podrían no ser adecuados / suficientes.
Utilice un argumento opcional:
(defun my-message (msg &optional vanillap)
(message (if vanillap msg (concat "**" msg "**"))))
(defun unaffected-fn ()
(my-message "Goodbye!" t))
(defun target-fn ()
(my-message "Hello!")
(unaffected-fn))
Usa una variable:
Esta es la razón por la que Emacs Lisp tiene enlace dinámico (además del enlace léxico).
(defvar my-msg-wrap "**")
(defun my-message (msg)
(message (concat my-msg-wrap msg my-msg-wrap)))
(defun unaffected-fn ()
(let ((my-msg-wrap ""))
(my-message "Goodbye!")))
(defun target-fn ()
(my-message "Hello!")
(unaffected-fn))