Dobrze się bawiłem, dodając kilka rad do funkcji:
(advice-add 'executable-find :around
(lambda (f &rest args)
(apply g args)))
;;; ^
Eee, literówka. Naprawiono to i ponownie oceniono powyższy kod. Ale teraz mam zarówno „poprawione”, jak i „zepsute” porady dotyczące tej funkcji.
Jak się ich pozbyć? Biorąc pod uwagę, że advice-remove
potrzebujesz albo obiektu funkcji, albo porady wokół (która tutaj jest pusta)?
(Oczywiście mogę po prostu wyjść i uruchomić ponownie, ale jest inny sposób, prawda?)
eq
poprzednią, (2) usuń poradę porówna funkcję, którą przekażesz, do porad, aż znajdzie jeden, który jesteq
do tego i usuń to, (3) nawet jeśli polecenie remove-remove zastosuje inny test, na przykładequal
, nadal nie zadziała, ponieważ różne oceny formy lambda nie będą sięequal
nawzajem. Okazuje się, że (1) jest poprawne, ale (2) i (3) są błędne: usuń poradyequal
i zastosuj tę samą ocenęlambda
dwukrotnieequal
!Jest
advice-mapc
jedna, która pozwala na iterację po wszystkich radach niektórych funkcji, z zastosowaniem każdej funkcji do każdej. Dzięki niemu łatwo jest usunąć wszystkie porady:Można to rozszerzyć, aby usunąć tylko porady, które nie mają
name
właściwości, szukającprops
argumentu second ( ) (który jest listą) dla tych, które nie mają czegoś związanego z kluczemname
.źródło
name
ułatwia usuwanie.Oto kod, który pomoże to zrobić interaktywnie.
Definiuje dwie funkcje. Pierwsza funkcja pobiera listę wszystkich porad dotyczących danego symbolu, druga funkcja interaktywnie prosi o symbol i poradę na temat tego symbolu, a następnie usuwa tę ostatnią z tego pierwszego. Ponieważ wszystko to dzieje się z ukończeniem, jest to dla mnie łatwiejsze niż skopiowanie wklejenia wyrażenia lambda.
źródło