Das neue Beratungssystem bietet folgende Vorteile:
add-function
: Dies ist brandneue Funktionalität, die einfach nicht Teil des Defadvice war. Es ist eine Art Hybrid zwischen add-hook
und defadvice
. Erwarten Sie in Zukunft mehr foo-function
(geänderte Via add-function
) und weniger foo-functions
(geänderte Via add-hook
) Variablen . Diese Funktionalität war die Hauptmotivation für die Implementierung des neuen Ratgebersystems, ausgelöst durch einen Fehlerbericht, in dem gefragt wurde, wie ein Prozessfilter zwischen verschiedenen Paketen "geteilt" werden soll.
add-function
Einfache Implementierung: Nach der Implementierung sind nur 8 KB erforderlich, um die advice-add
Funktionalität zu implementieren, die nahezu die gesamte Funktionalität von 100 KB von advice.el bietet.
Einfaches Design: Defadvice hat verschiedene Begriffe, die im Allgemeinen schwer zu verstehen sind und / oder nur selten verwendet werden. ZB der Unterschied zwischen "Aktivieren" und "Aktivieren" von Hinweisen. Oder die Bedeutung von "vor" und / oder "kompiliert". Es gibt auch Macken in der Handhabung ad-do-it
, wie die Tatsache, dass es eher wie eine Variablenreferenz als wie ein Aufruf aussieht, oder dass Sie (setq ad-return-value ...)
den Wert explizit zurückgeben müssen, anstatt ihn einfach zurückzugeben.
Defadvice leidet unter verschiedenen Problemen bei der Makroexpansion und -kompilierung: Der Inhalt eines Hinweises wird nicht als "Code" (den der Compiler und der Makroexpander sehen), sondern als "Daten" dargestellt, die später zu einem Ausdruck kombiniert werden. Daher erfolgt die Makroexpansion zu spät (was bei der Verwendung von Dingen wie überraschend sein kann (eval-when-compile (require 'foo))
), und es ist schwierig, das lexikalische Scoping korrekt zu speichern.
Was die Frage betrifft, ob Sie auf das neue System umsteigen müssen: Ich beabsichtige, das alte Defadvice irgendwann in der Zukunft loszuwerden, aber ich denke, diese Zukunft ist relativ weit entfernt (und sie muss erst verschoben werden lisp/obsolete
, dann später) zu GNU ELPA).
:around
Beratung (oder:filter-args
oder:filter-result
Beratung) , um den gleichen Effekt zu erzielen.Einer der eindeutigen Vorteile von Ratschlägen für normale Funktionen ist, dass Sie eine Definition mit besuchen können
find-function
.Derzeit wird beim Anzeigen der Hilfe für eine (im neuen Stil) empfohlene Funktion ein Link zur Hilfe für die Hinweisfunktion und von dort aus ein Link zur Quelle bereitgestellt (wie bei Funktionshilfen üblich).
Das alte System lieferte den Hinweis docstring inline, aber es gab keine Möglichkeit, den Code zu sehen (auf den ich normalerweise zurückgegriffen habe
rgrep
).(Persönlich würde ich gerne eine Mischung aus alten und neuen Ansätzen für die Anzeige der Hilfe sehen, da mir der Inline-Docstring gefallen hat, aber ich bin mir sicher, dass dies später möglich ist.)
quelle
defadvice
. Siehe diesen Emacs-Fehlerbericht . Das ist ein Mangel.Aus dem Dateiheader:
Wie ich es lese, ist es das primäre Ziel, einfacher als das alte Ratgebersystem zu sein und nicht mehr Fähigkeiten zu haben. Das Lesen der Dokumentation scheint
advice-add
eine Teilmenge derdefadvice
Funktionen zu enthalten, währendadd-function
einige nützliche Funktionen für die Empfehlung nicht traditioneller Funktionen wie Prozessfilter enthalten sind (was wahrscheinlich mit möglich wardefadvice
, aber ich bin nicht sicher, wie).Soweit ich weiß,
defadvice
ist es nicht offiziell veraltet, so dass Sie sich frei fühlen sollten, es vorerst weiter zu verwenden (und wenn Sie ein Paketautor sind, möchten Sie es wahrscheinlich weiter verwenden, bis 24.4 weiter verbreitet wird). Es hört sich jedoch so an, als wollten die Emacs-Autoren irgendwann vollständig auf das neue System migrieren. Daher ist es wahrscheinlich sinnvoll, langsam umzuschalten.quelle
defadvice
(und das wird auch weiterhin so sein).Eine Sache , die ich hier nicht erwähnt gesehen - wenn auch in gewisser Weise ist es wegen der einfacheren Ansatz (bessere Modularität und „Klebstoff“) des „neuen“ Beratungssystem, das hat in anderen Antworten erwähnt - ist dies: Es ist viel einfacher, Ratschläge hinzuzufügen, zu kombinieren, zu entfernen, neu zu ordnen usw.
Es ist sogar möglich, dies interaktiv und dynamisch zu tun, obwohl nadvice ein wenig Hilfe benötigt, um dies zu ermöglichen. Mir ist keine andere Verwendung von nadvice auf diese Weise (interaktive Zusammenstellung von Ratschlägen) bekannt, aber es gibt mindestens eine solche Anwendung. Ich benutze es in Isearch + , um Ihnen zu ermöglichen, während der Suche Kombinationen beliebiger Isearch-Filter-Prädikate (Filter) hinzuzufügen und zu entfernen.
IOW, genau wie Sie Ihr Suchmuster schrittweise ändern, können Sie Ihre Suche im Handumdrehen mithilfe mehrerer Filter verfeinern.
Die Suchfilterung erfolgt mit Variablen
isearch-filter-predicate
, die bereits seit einiger Zeit zur Verfügung stehen. Isearch-Filter werden jedoch nicht häufig definiert. Sie sind in der Regel statisch und für einen bestimmten Kontext vordefiniert (z. B. Wdired). Zumindest interaktiv ist es für Benutzer nicht einfach, sie zu definieren und zu verwenden.Es gibt nur eine Variable.
isearch-filter-predicate
Wenn Sie also die Filterung ändern, müssen Sie das Prädikat eines einzelnen Filters ändern. Dies bedeutet, dass Funktionen erstellt, Prädikate kombiniert, die Suche eingegrenzt, erweitert oder auf andere Weise geändert werden.Aber genau das kann nadvice. Insgesamt ist nadvice so praktisch, um Funktionen zu kombinieren, dass es einfach ist, die Suchfilterung interaktiv zu verfeinern. (Weitere Informationen hierzu finden Sie unter Dynamische Suchfilterung .)
quelle