der sds Antwort funktioniert, außer dass Sie vermutlich wollen nur bar
Beratung, wenn sample
ausgeführt wird, so dass Sie Probe beraten bräuchten sowie zum Aktivieren und Deaktivieren des Hinweises für bar
. Mein with-temporary-advice
Makro erleichtert dies:
(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))
Beachten Sie, dass, wenn bar
auch auf andere Weise aufgerufen wird, während sample
ausgeführt wird, die Beratung als auch für die Anrufe gelten, so dass Sie für dieses Konto sollte, wenn es eine Möglichkeit ist.
Alternativ können Sie auch flet
verwenden, um bar
bei Bedarf neu zu definieren. Dies unterliegt selbstverständlich dem gleichen Vorbehalt wie die erste Lösung.
(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)))
Das viel einfacher zu lesen ist, aber aus Gründen, die ich nicht verstehen flet
ist, wie von Emacs 24.3, nicht mehr dafür. Sein Docstring schlägt vor, stattdessen cl-flet
zu verwenden, aber da cl-flet
lexikalische Bindung verwendet, wird das nicht wirklich funktionieren. So gut ich es beurteilen konnte, es klang wie flet
ist eigentlich nicht weg, aber die aktuelle Empfehlung scheint zu sein, stattdessen Rat zu verwenden.
Beachten Sie auch, dass, wenn innerhalb bar
, das unerwünschte Verhalten auf einigen Variable abhing, dann wäre es besser, eine let
Bindung an diese Variable zu verwenden, anstatt der flet
auf die Funktion zu binden.
Edit:
Diese Ansätze machen es schwieriger, zu sehen, was, natürlich geschieht. Abhängig von der genauen Situation, ist es möglicherweise besser, einfach die sample
Funktion neu zu definieren, um das zu tun, was Sie wollen (oder eine my-sample
Funktion zu schreiben, um an ihrer Stelle aufzurufen, wie Sie vorgeschlagen haben).
Während Sie eine sehr klare Beschreibung des Problems geben hat, wenn man die aktuelle Situation geben und Funktion, die Sie außer Kraft setzen möchten, könnten andere Optionen eröffnen. –
@TreyJackson Die tatsächliche Situation ist ein wenig komplex zu beschreiben, was ich oben geschrieben habe, ist die einfachste, aber die beste Beschreibung dieser Situation, aber jetzt bekomme ich die Antwort, danke. :-) –