delle sds opere risposta, tranne che si presumibilmente desideri solo da consigliare bar
quando sample
è in esecuzione, in modo avresti bisogno di consigliare campione anche per attivare e disattivare i consigli per bar
. Il mio with-temporary-advice
macro facilita questo:
(defmacro with-temporary-advice (function class name &rest body)
"Enable the specified advice, evaluate BODY, then disable the advice."
`(unwind-protect
(progn
(ad-enable-advice ,function ,class ,name)
(ad-activate ,function)
,@body)
(ad-disable-advice ,function ,class ,name)
(ad-activate ,function)))
(defadvice bar (around my-conditional-bar disable)
;; This advice disabled by default, and enabled dynamically.
(when condition
ad-do-it))
(defadvice sample (around my-sample-advice activate)
"Make execution of `bar' conditional when running `sample'."
(with-temporary-advice 'bar 'around 'my-conditional-bar
ad-do-it))
Nota che se bar
è chiamato anche in altri modi, mentre sample
è in esecuzione, il consiglio si applica per le chiamate pure, così si dovrebbe tenere conto che, se si tratta di una possibilità.
In alternativa, è possibile utilizzare flet
per ridefinire bar
quando richiesto. Questo è soggetto alla stessa avvertenza della prima soluzione, ovviamente.
(defadvice sample (around my-sample-advice activate)
"Make execution of `bar' conditional when running `sample'."
(if condition
ad-do-it
(flet ((bar() nil))
ad-do-it)))
Ecco molto più semplice da leggere, ma per ragioni che non capisco flet
è, come di Emacs 24.3, non è più a favore. La sua docstring suggerisce invece di utilizzare cl-flet
, ma come cl-flet
utilizza il binding lessicale, che in realtà non funzionerà. Come meglio potrei dire, sembrava che flet
non stia andando via, tuttavia la raccomandazione attuale sembra essere quella di usare i consigli.
noti inoltre che se, all'interno bar
, il comportamento indesiderato dipendeva qualche variabile , allora sarebbe preferibile utilizzare un let
vincolante per tale variabile anziché il flet
vincolante per la funzione.
Edit:
Questi approcci fanno rendere più difficile per vedere ciò che sta accadendo, ovviamente. A seconda della situazione esatta, potrebbe essere preferibile ridefinire semplicemente la funzione sample
per fare ciò che si desidera (o scrivere una funzione my-sample
per chiamare al suo posto, come suggerito).
Mentre ha dato una chiara descrizione del problema, se si dà la situazione reale e la funzione che si desidera ignorare, altre opzioni potrebbero aprirsi. –
@TreyJackson La situazione attuale è un po 'complessa da descrivere, quello che ho scritto sopra è la descrizione più semplice ma migliore di quella situazione, tuttavia ora ho la risposta, grazie. :-) –