Vantaggi pratici del nuovo sistema di consulenza in Emacs 24.4


53

Emacs 24.4 viene fornito con un nuovo sistema di consulenza. Il NEWSfile dice:

** Il nuovo pacchetto nadvice.eloffre servizi di consulenza più leggeri. È stratificato come:

*** add-function/ remove-function, che può essere utilizzato per aggiungere / rimuovere il codice in qualsiasi luogo che trasporta funzioni, come filtri di processo o <foo>-functionganci.

*** advice-add/ advice-removeper aggiungere / rimuovere un consiglio su una funzione denominata, proprio come defadvicefa.

D: Quali sono i vantaggi e le implicazioni pratiche di questo nuovo pacchetto?

Sono particolarmente interessato alle risposte che affrontano i seguenti punti:

  • Se sto usando solo consigli per personalizzare Emacs (anziché scrivere pacchetti aggiuntivi), devo passare al nuovo sistema? Sostituirà il vecchio sistema ad un certo punto?

  • Cosa posso fare esattamente con il nuovo sistema che non riesco a realizzare defadvice?

  • Qual è il significato di essere in grado di "aggiungere / rimuovere codice in qualsiasi luogo che trasporta funzioni"?

Risposte:


57

Il nuovo sistema di consulenza presenta i seguenti vantaggi:

  • add-function: Questa è una funzionalità nuova di zecca che semplicemente non faceva parte del defadvice. È una specie di ibrido tra add-hooke defadvice. In futuro, aspettatevi più foo-functionvariabili (modificate via add-function) e meno foo-functions(modificate via add-hook). Questa funzionalità è stata la motivazione principale per implementare il nuovo sistema di consulenza, innescata da una segnalazione di bug che chiede come "condividere" un filtro di processo tra diversi pacchetti.

  • Semplicità di implementazione: una volta add-functionimplementata, bastano solo 8 KB per implementare la advice-addfunzionalità che porta praticamente tutte le funzionalità dei 100 KB di consulenza.el.

  • Semplicità di progettazione: defadvice ha varie nozioni che sono generalmente difficili da comprendere con precisione e / o utilizzate raramente. Ad esempio, la differenza tra i consigli "abilitazione" e "attivazione". O il significato di "pre" e / o "compilato". Ci sono anche stranezze nella gestione di ad-do-it, come il fatto che assomigli a un riferimento a variabili piuttosto che a una chiamata, o al fatto che è necessario (setq ad-return-value ...)esplicitamente anziché semplicemente restituire il valore.

  • Defadvice soffre di vari problemi con la macroespansione e la compilazione: il corpo di un consiglio non è esposto come "codice" (che il compilatore e il macroexpander vedono) ma come "dati" che vengono successivamente combinati per creare un'espressione. Quindi la macroespansione avviene in ritardo (il che può causare sorprese se si usano cose del genere (eval-when-compile (require 'foo))) e l'ambito lessicale è difficile da preservare correttamente.

Per quanto riguarda se è necessario passare al nuovo sistema: ho intenzione di sbarazzarmi del vecchio defadvice ad un certo punto in futuro, ma penso che questo futuro sia relativamente distante (e dovrà prima spostarsi lisp/obsolete, poi a GNU ELPA).


1
Esistono piani per aggiungere a nadvice.el le stesse funzionalità di modifica degli argomenti offerte dal vecchio sistema di consulenza?
Aaron Miller,

No, praticamente non ha senso nel contesto di nadvice.el in cui le funzioni di avviso sono semplicemente vecchie funzioni normali. Ma puoi usare :aroundconsigli ( :filter-argsoo :filter-resultconsigli) per ottenere lo stesso effetto.
Stefan

2
Non posso, però. Supponiamo di voler consigliare una funzione di due argomenti, sostituendo solo il secondo argomento, in modo che la funzione consigliata continui a richiedere in base al suo modulo interattivo per il primo. I nuovi consigli sembrano fornire un paio di modi diversi per sostituire il modulo interattivo di una funzione consigliata, ma non vedo nulla che offra più sfumature di quello.
Aaron Miller

@AaronMiller: Per favore, falla una domanda SX separata, in modo che possa essere discussa senza i limiti artificiali dei commenti SX.
Stefan

Fatto, a emacs.stackexchange.com/q/19233/2162 . Apprezzo il tuo seguito. (Mi piacerebbe anche curioso di vedere la segnalazione di bug si parla nella sua risposta, ma non sono stati in grado di trovare tramite Google o mailing list Ricerca Archivio di Ti dispiace che lo collega.?)
Aaron Miller

9

Uno dei chiari vantaggi del consiglio essendo le normali funzioni è che puoi visitare una definizione con find-function.

Al momento, quando si visualizza la guida per una funzione (di nuovo stile) consigliata, fornisce un collegamento alla guida per la funzione di avviso e da lì un collegamento alla fonte (come al solito per la guida della funzione).

Il vecchio sistema forniva la documentazione in linea, ma non c'era modo di vedere il codice (di solito ricorrevo a rgrep).

(Personalmente mi piacerebbe vedere una miscela di vecchi e nuovi approcci per mostrare l'aiuto, dato che mi piaceva avere la documentazione in linea, ma sono sicuro che sia possibile lungo la strada.)


2
Sì, è un peccato che il nuovo sistema di consulenza non ti consenta di aggiungere alla stringa di documenti esistente come defadvicefa. Vedi questo report sui bug di Emacs . Questo è un difetto.
Disegnato il

8

Dall'intestazione del file:

;;; 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.

Mentre lo leggo, l'obiettivo principale è essere più semplice del vecchio sistema di consulenza, non avere più capacità. Leggendo i documenti, sembra che advice-addcontenga un sottoinsieme delle defadvicefunzionalità di, mentre add-functioncontiene alcune belle funzionalità per consigliare funzioni non tradizionali come i filtri di processo (che probabilmente era possibile con defadvice, ma non sono sicuro di come).

Per quanto ne so, defadvicenon è ufficialmente deprecato, quindi dovresti sentirti libero di continuare ad usarlo per ora (e se sei un autore di pacchetti, probabilmente vorrai continuare ad usarlo fino a quando la 24.4 non sarà adottata più ampiamente). Tuttavia, sembra che gli autori di Emacs vogliano migrare completamente sul nuovo sistema alla fine, quindi probabilmente ha senso cambiare lentamente.



Sì. Il nuovo è diverso, non di più. E sì, c'è molto uso di defadvicelà fuori (e continuerà ad esserlo).
Disegnato il

0

Una cosa che non ho visto menzionato qui - sebbene in qualche modo sia dovuta all'approccio più semplice (migliore modularità e "colla") del "nuovo" sistema di consulenza, che è stato menzionato in altre risposte - è questa: è molto più facile aggiungere, combinare, rimuovere, riordinare , ecc. consigli di nadvice.

È anche possibile farlo in modo interattivo, dinamico, anche se nadvice ha bisogno di un piccolo aiuto per facilitare questo. Non sono a conoscenza di altri usi di nadvice in questo modo (composizione interattiva di consigli), ma esiste almeno una di queste applicazioni. Lo uso in Isearch + , per consentirti di aggiungere e rimuovere combinazioni di predicati (filtri) del filtro Isearch arbitrari durante la ricerca.

IOW, così come si modifica il modello di ricerca in modo incrementale, in modo da poter affinare la ricerca al volo utilizzando più filtri.

Il filtro Isearch viene eseguito utilizzando la variabile isearch-filter-predicate, che è disponibile da un po 'di tempo. Tuttavia i filtri Isearch non sono definiti spesso. Sono in genere statici e predefiniti per un determinato contesto (ad esempio Wdired). Non è molto facile per gli utenti definirli e utilizzarli, almeno in modo interattivo.

C'è solo una variabile, isearch-filter-predicatequindi cambiare il filtro significa davvero cambiare il predicato del filtro singolo, che equivale a comporre funzioni, combinare predicati, restringere, espandere o altrimenti modificare la ricerca.

Ma è esattamente ciò a cui nadvice è bravo. In breve, nadvice è così utile per combinare le funzioni che può semplificare il perfezionamento interattivo del filtro di ricerca. (Vedi Filtro dinamico Isearch per ulteriori informazioni al riguardo.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.