SDS, z wyjątkiem, że prawdopodobnie tylko chcą być doradzanie bar
gdy sample
realizuje, więc trzeba by doradzić próbkę oraz w celu aktywowania i dezaktywacji porady dotyczącej bar
. Moja with-temporary-advice
makro ułatwia to:
(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))
pamiętać, że jeśli bar
nazywana jest także w inny sposób podczas sample
jest wykonywany, rada będzie ubiegać się o tych połączeń, tak więc należy wyjaśnić, że jeśli jest taka możliwość.
Alternatywnie możesz użyć opcji flet
, aby w razie potrzeby zmienić definicję bar
. Podlega to temu samemu zastrzeżeniu co pierwsze rozwiązanie.
(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)))
To znacznie prostsze do odczytania, ale ze względów nie rozumiem flet
jest, jak Emacs 24.3, nie jest już za. Jego docstring sugeruje użycie zamiast tego cl-flet
, ale ponieważ cl-flet
używa leksykalnego wiązania, to tak naprawdę nie zadziała. Jak mogłem powiedzieć, brzmiało to tak, jakby flet
właściwie nie zniknęło, jednak obecną rekomendacją wydaje się być użycie porady.
Należy również pamiętać, że jeśli wewnątrz bar
, niechciane zachowanie zależy od jakiegoś zmiennej, to byłoby korzystne, aby wykorzystywać let
wiążące dla tej zmiennej zamiast flet
wiążące funkcji.
Edit:
Podejścia te robią to trudniejsze, aby zobaczyć co się dzieje, oczywiście. W zależności od konkretnej sytuacji może być bardziej pożądane niż po prostu przedefiniować funkcję sample
, aby zrobić to, co chcesz (lub napisać funkcję my-sample
, aby wywołać w jej miejsce, zgodnie z sugestią).
Podczas dawało bardzo wyraźny opis problemu, jeśli dać rzeczywistą sytuację i działać chcesz zastąpić inne opcje mogą otworzyć. –
@TreyJackson Właściwa sytuacja jest trochę skomplikowana do opisania, to co napisałem powyżej jest najprostszym, ale najlepszym opisem tej sytuacji, jednak teraz otrzymuję odpowiedź, dziękuję. :-) –