Praktyczne zalety nowego systemu porad w Emacsie 24.4

53

Emacs 24.4 jest wyposażony w nowy system porad. NEWSPlik mówi:

** Nowy pakiet nadvice.eloferuje lżejsze usługi doradcze. Składa się z następujących warstw:

*** add-function/ remove-function, którego można użyć do dodania / usunięcia kodu w dowolnym miejscu, w którym znajdują się funkcje, takim jak filtry procesowe lub <foo>-functionhaki.

*** advice-add/, advice-removeaby dodać / usunąć fragment porady na temat nazwanej funkcji, podobnie jak defadvicerobi.

P: Jakie są praktyczne korzyści i implikacje tego nowego pakietu?

Szczególnie interesują mnie odpowiedzi dotyczące następujących kwestii:

  • Jeśli korzystam tylko z porad, aby dostosować Emacsa (w przeciwieństwie do pisania dodatków), czy muszę przejść na nowy system? Czy w pewnym momencie zastąpi stary system?

  • Co dokładnie mogę zrobić z nowym systemem, którego nie mogę osiągnąć defadvice?

  • Jakie znaczenie ma możliwość „dodawania / usuwania kodu w dowolnym miejscu pełniącym funkcję”?

itsjeyd
źródło

Odpowiedzi:

57

Nowy system porad ma następujące zalety:

  • add-function: Jest to zupełnie nowa funkcjonalność, która po prostu nie była częścią defadvice. Jest to rodzaj hybrydy między add-hooki defadvice. W przyszłości spodziewaj się więcej foo-functionzmiennych (zmodyfikowanych przez add-function) i mniej foo-functions(zmodyfikowanych przez add-hook). Ta funkcjonalność była główną motywacją do wdrożenia nowego systemu porad, wywołanego przez raport o błędzie z pytaniem, jak „udostępnić” filtr procesu między różnymi pakietami.

  • Prostota implementacji: po add-functionwdrożeniu zajmuje tylko 8 KB, aby wdrożyć advice-addfunkcjonalność, która zapewnia prawie całą funkcjonalność 100 KB porady.el.

  • Prostota projektu: defadvice ma różne pojęcia, które są generalnie trudne do precyzyjnego zrozumienia i / lub rzadko używane. Np. Różnica między poradami „włączającymi” i „aktywującymi”. Lub znaczenie „pre” i / lub „skompilowane”. Istnieją również dziwactwa w obsłudze ad-do-it, takie jak fakt, że wygląda to raczej na odwołanie do zmiennej, a nie na wywołanie, lub fakt, że trzeba (setq ad-return-value ...)jawnie, a nie po prostu zwracać wartość.

  • Defadvice cierpi z powodu różnych problemów związanych z rozszerzaniem i kompilacją makr: treść porady nie jest ujawniana jako „kod” (który widzi kompilator i makroekspander), ale jako „dane”, które są następnie łączone w celu utworzenia wyrażenia. Tak więc makroekspansja zdarza się późno (co może powodować niespodzianki, jeśli używasz takich rzeczy (eval-when-compile (require 'foo))), a ustalanie zakresu leksykalnego jest trudne do zachowania.

Jeśli chodzi o to, czy musisz przejść na nowy system: zamierzam pozbyć się starej defadvice w pewnym momencie w przyszłości, ale myślę, że ta przyszłość jest stosunkowo odległa (i najpierw trzeba będzie się przenieść lisp/obsolete, a później do GNU ELPA).

Stefan
źródło
1
Czy istnieją plany dodania do nadvice.el tej samej funkcji modyfikacji argumentów, którą oferuje stary system porad?
Aaron Miller
Nie, to właściwie nie ma sensu w kontekście nadvice.el, w którym funkcje porady są zwykłymi starymi funkcjami normalnymi. Ale możesz użyć :aroundporady ( :filter-argslub :filter-resultporady), aby uzyskać ten sam efekt.
Stefan
2
Nie mogę jednak. Załóżmy, że chcę doradzić funkcję dwóch argumentów, zastępując tylko drugi argument, aby zalecana funkcja nadal wyświetlała monit zgodnie z jej interaktywną formą dla pierwszego. Nowa rada wydaje się oferować kilka różnych sposobów na zastąpienie interaktywnej formy zalecanej funkcji, ale nie widzę nic, co oferuje więcej niuansów.
Aaron Miller
@AaronMiller: Proszę uczynić to osobnym pytaniem SX, aby można je było omawiać bez sztucznych ograniczeń komentarzy SX.
Stefan
Gotowe, na emacs.stackexchange.com/q/19233/2162 . Doceniam twoje działania następcze. (Byłbym również ciekawy, aby zobaczyć raport o błędzie, o którym wspomniałeś w swojej odpowiedzi, ale nie mogłem go znaleźć za pomocą Google lub przeszukiwania archiwum listy adresowej. Czy masz coś przeciwko temu?)
Aaron Miller,
9

Jedną z wyraźnych korzyści wynikających z bycia normalnymi funkcjami jest to, że można odwiedzić definicję find-function.

Obecnie podczas przeglądania pomocy dla funkcji zalecanej (w nowym stylu) zawiera ona link do pomocy dla funkcji porady, a stamtąd link do źródła (jak zwykle dla pomocy funkcji).

Stary system zawierał informacje w formie instrukcji, ale nie było sposobu, aby zobaczyć kod (zwykle uciekałem się rgrep).

(Osobiście chciałbym zobaczyć połączenie starego i nowego podejścia do wyświetlania pomocy, ponieważ lubiłem mieć wbudowany dokument, ale jestem pewien, że jest to możliwe na później.)

phils
źródło
2
Tak, szkoda, że ​​nowy system porad nie pozwala dodawać do istniejącego ciągu dokumentów tak jak defadvice. Zobacz raport o błędach Emacsa . To jest wada.
Drew
8

Z nagłówka pliku:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

Kiedy czytam, głównym celem jest prostota niż stary system porad, a nie posiadanie większych możliwości. Czytając dokumentację, wydaje się, że advice-addzawiera podzbiór defadvicefunkcjonalności, a jednocześnie add-functionzawiera niezłą funkcjonalność do doradzania nietradycyjnym funkcjom, takim jak filtry procesów (co prawdopodobnie było możliwe przy pomocy defadvice, ale nie jestem pewien jak).

O ile mi wiadomo, defadvicenie jest oficjalnie przestarzałe, więc powinieneś swobodnie korzystać z niego na razie (a jeśli jesteś autorem pakietu, prawdopodobnie zechcesz nadal go używać, dopóki 24.4 nie zostanie szerzej przyjęte). Wygląda jednak na to, że autorzy Emacsa chcą ostatecznie całkowicie migrować do nowego systemu, więc prawdopodobnie warto powoli się przełączać.

shosti
źródło
Tak. Nowe jest inne, nie więcej. I tak, istnieje wiele zastosowań defadvice(i nadal będzie).
Drew
0

Jedna rzecz nie widziałem wspomniano tutaj - chociaż w pewnym sensie jest to ze względu na prostszą podejścia (lepiej modułowości i „klej”) „nowego” systemu doradztwa, który został już wspomniano w innych odpowiedzi - jest to: o wiele łatwiej jest dodawać, łączyć, usuwać, zmieniać kolejność itp.

Można to nawet zrobić interaktywnie, dynamicznie, choć nadvice potrzebuje niewielkiej pomocy, aby to ułatwić. Nie znam innych zastosowań nadvice w ten sposób (interaktywna kompozycja porad), ale istnieje co najmniej jedna taka aplikacja. Korzystam z niego w Isearch + , aby umożliwić dodawanie i usuwanie kombinacji dowolnych predykatów filtrów Isearch (filtrów) podczas wyszukiwania.

IOW, podobnie jak stopniowo zmieniasz wzorzec wyszukiwania, dzięki czemu możesz zawęzić wyszukiwanie w locie za pomocą wielu filtrów.

Filtrowanie Isearch odbywa się za pomocą zmiennej isearch-filter-predicate, która jest dostępna od dłuższego czasu. Jednak filtry Isearch nie są często definiowane. Są zazwyczaj statyczne i predefiniowane dla danego kontekstu (np. Wdired). Użytkownicy nie są w stanie ich zdefiniować i używać, przynajmniej interaktywnie.

Jest tylko jedna zmienna, isearch-filter-predicatewięc zmiana filtrowania naprawdę oznacza zmianę predykatu z pojedynczym filtrem, co sprowadza się do komponowania funkcji, łączenia predykatów, zawężania, rozszerzania lub innego modyfikowania wyszukiwania.

Ale właśnie w tym nadvice jest dobra. Podsumowując, nadvice jest tak przydatny do łączenia funkcji, że może ułatwić interaktywne udoskonalanie filtrowania wyszukiwania. (Zobacz Dynamiczne filtrowanie wyszukiwania, aby uzyskać więcej informacji na ten temat.)

Rysował
źródło