Avantages pratiques du nouveau système de conseil dans Emacs 24.4

53

Emacs 24.4 est livré avec un nouveau système de conseil. Le NEWSfichier dit:

** Le nouveau forfait nadvice.eloffre des installations de conseil plus légères. Il est stratifié comme:

*** add-function/ remove-function, qui peut être utilisé pour ajouter / supprimer du code sur n'importe quel emplacement comportant des fonctions, tels que des filtres de processus ou des <foo>-functioncrochets.

*** advice-add/ advice-removepour ajouter / supprimer un conseil sur une fonction nommée, un peu comme le defadvicefait le fait.

Q: Quels sont les avantages pratiques et les implications de ce nouveau package?

Je suis particulièrement intéressé par les réponses aux points suivants:

  • Si je n'utilise que des conseils pour personnaliser Emacs (par opposition à l'écriture de packages complémentaires), dois-je passer au nouveau système? Va-t-il remplacer l'ancien système à un moment donné?

  • Que puis-je faire exactement avec le nouveau système que je ne peux pas accomplir defadvice?

  • Quelle est l’importance de pouvoir "ajouter / supprimer du code sur n’importe quel lieu porteur de fonctions"?

itsjeyd
la source

Réponses:

57

Le nouveau système de conseil présente les avantages suivants:

  • add-function: Ceci est une toute nouvelle fonctionnalité qui ne faisait tout simplement pas partie des défauts. C'est une sorte d'hybride entre add-hooket defadvice. A l'avenir, attendez-vous à plus de foo-functionvariables (modifiées via add-function) et moins foo-functions(modifiées via add-hook). Cette fonctionnalité a été la principale motivation pour implémenter le nouveau système de conseil, déclenchée par un rapport de bogue demandant comment "partager" un filtre de processus entre différents packages.

  • Simplicité d'implémentation: une fois add-functionimplémentée, il ne faut que 8Ko pour implémenter la advice-addfonctionnalité qui apporte à peu près toutes les fonctionnalités de 100Ko de advice.el.

  • Simplicité de conception: defadvice a diverses notions généralement difficiles à comprendre avec précision et / ou rarement utilisées. Par exemple, la différence entre "activer" et "activer" des conseils. Ou le sens de "pre" et / ou "compilé". Il existe également des bizarreries dans le traitement de ad-do-it, telles que le fait que cela ressemble à une référence de variable plutôt qu’un appel, ou le fait que vous devez (setq ad-return-value ...)explicitement plutôt que simplement renvoyer la valeur.

  • Defadvice souffre de divers problèmes concernant l’expansion et la compilation de macro: le corps d’un conseil n’est pas exposé en tant que "code" (que le compilateur et le macroexpander voient) mais en tant que "données" qui sont ensuite combinées pour constituer une expression. Donc, la macro-expansion arrive en retard (ce qui peut causer des surprises si vous utilisez des choses comme (eval-when-compile (require 'foo))) et il est difficile de conserver correctement le périmètre lexical.

Pour ce qui est de savoir si vous devez passer au nouveau système: j’ai l’intention de me débarrasser de cet ancien désavantage à un moment donné dans l’avenir, mais je pense que cet avenir est relativement lointain (et il faudra d’abord passer à lisp/obsolete, puis à plus tard. GNU ELPA).

Stefan
la source
1
Existe-t-il des plans pour ajouter à nadvice.el la même fonctionnalité de modification d'argument offerte par l'ancien système de conseil?
Aaron Miller
Non, cela n’a aucun sens dans le contexte de nadvice.el où les fonctions de conseil sont tout simplement des fonctions anciennes. Mais vous pouvez utiliser des :aroundconseils (ou :filter-argsou :filter-resultconseils) pour obtenir le même effet.
Stefan
2
Je ne peux pas, cependant. Supposons que je veuille conseiller une fonction de deux arguments, en remplaçant seulement le deuxième argument, de sorte que la fonction conseillée sera toujours invitée en fonction de sa forme interactive pour le premier. Les nouveaux conseils semblent fournir différentes manières de remplacer le formulaire interactif d’une fonction recommandée, mais je ne vois rien qui offre plus de nuance que cela.
Aaron Miller
@AaronMiller: Veuillez en faire une question distincte sur SX, afin qu'elle puisse être discutée sans les limites artificielles des commentaires SX.
Stefan
Fait à l' adresse emacs.stackexchange.com/q/19233/2162 . J'apprécie votre suivi. (Je serais également curieux de voir le rapport de bogue que vous mentionnez dans votre réponse, mais je n'ai pas pu trouver via Google ou une recherche d'archives de la liste de diffusion ne vous dérange lier.?)
Aaron Miller
9

L'un des avantages évidents des conseils en tant que fonctions normales est que vous pouvez consulter une définition avec find-function.

À l'heure actuelle, lorsque vous consultez l'aide d'une fonction conseillée (de style nouveau), il fournit un lien vers l'aide de la fonction de conseil, puis un lien vers la source (comme d'habitude pour l'aide de la fonction).

L'ancien système fournissait les conseils en ligne docstring, mais il n'y avait aucun moyen de voir le code (j'avais généralement recours à rgrep).

(Personnellement, j'aimerais voir un mélange d'anciennes et de nouvelles approches d'affichage de l'aide, car j'aimais bien avoir la docstring en ligne, mais je suis sûr que cela est possible par la suite.)

phils
la source
2
Oui, il est dommage que le nouveau système de conseil ne vous permette pas d’ajouter à la chaîne de documentation existante defadvice. Voir ce rapport de bogue Emacs . C'est une lacune.
Drew
8

De l'en-tête du fichier:

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

D'après ce que j'ai lu, l'objectif premier est d'être plus simple que l'ancien système de conseil, sans avoir plus de fonctionnalités. En lisant les documents, il semble que cela advice-addcontienne un sous-ensemble de defadvicefonctionnalités de, tout en add-functioncontenant quelques fonctionnalités utiles pour conseiller des fonctions non traditionnelles telles que les filtres de processus (ce qui était probablement possible avec defadvice, mais je ne sais pas comment).

Autant que je sache, il defadvicen'est pas officiellement obsolète. Vous devriez donc continuer à l'utiliser (et si vous êtes auteur d'un paquet, vous voudrez probablement continuer à l'utiliser jusqu'à ce que 24.4 soit plus largement adopté). Cependant, il semble que les auteurs d’Emacs souhaitent migrer complètement vers le nouveau système, il est donc probablement logique de basculer lentement.

Shosti
la source
Oui. Le nouveau est différent, pas plus. Et oui, il y a beaucoup d'utilisation de defadvicedehors (et il continuera à être).
Drew
0

Une chose que je n'ai pas vue mentionnée ici - bien qu'à certains égards, cela soit dû à l'approche plus simple (meilleure modularité et "colle") du "nouveau" système de conseil, qui a été mentionné dans d'autres réponses, est la suivante: Il est beaucoup plus facile d'ajouter, de combiner, de supprimer, de réorganiser , etc.

Il est même possible de le faire de manière interactive, dynamique, bien qu'un conseil ait besoin d'un petit coup de pouce pour le faciliter. Je ne suis pas au courant d'autres utilisations de nadvice de cette façon (composition interactive de conseils), mais il existe au moins une application de ce type. Je l'utilise dans Isearch + pour vous permettre d'ajouter et de supprimer des combinaisons de prédicats de filtre Isearch arbitraires (filtres) lors d'une recherche.

IOW, tout comme vous modifiez votre modèle de recherche de manière incrémentielle, vous pouvez ainsi affiner votre recherche à la volée en utilisant plusieurs filtres.

Le filtrage Isearch est effectué à l'aide d'une variable isearch-filter-predicate, disponible depuis un certain temps déjà. Pourtant, les filtres Isearch ne sont pas définis souvent. Ils sont généralement statiques et prédéfinis pour un contexte donné (par exemple, Wdired). Il n'est pas très facile pour les utilisateurs de les définir et de les utiliser, du moins de manière interactive.

Il n'y a qu'une seule variable. Par isearch-filter-predicateconséquent, modifier le filtrage signifie en réalité changer le prédicat de filtre unique, ce qui revient à composer des fonctions, à combiner des prédicats, pour affiner, développer ou modifier autrement la recherche.

Mais c’est exactement ce à quoi nadvice est bon. En résumé, nadvice est si pratique pour combiner des fonctions qu’il est facile d’ affiner le filtrage de recherche de manière interactive . (Voir Filtrage dynamique Isearch pour plus d'informations à ce sujet.)

A dessiné
la source