Beneficios prácticos del nuevo sistema de asesoramiento en Emacs 24.4


53

Emacs 24.4 viene con un nuevo sistema de consejos. El NEWSarchivo dice:

** El nuevo paquete nadvice.elofrece servicios de asesoramiento más livianos. Está en capas como:

*** add-function/ remove-function, que se puede usar para agregar / eliminar código en cualquier lugar que lleve funciones, como filtros de proceso o <foo>-functionganchos.

*** advice-add/ advice-removepara agregar / eliminar un consejo sobre una función con nombre, al igual que lo defadvicehace.

P: ¿Cuáles son los beneficios prácticos y las implicaciones de este nuevo paquete?

Estoy especialmente interesado en respuestas que aborden los siguientes puntos:

  • Si solo estoy usando consejos para personalizar Emacs (en lugar de escribir paquetes de complementos), ¿necesito cambiar al nuevo sistema? ¿Reemplazará el viejo sistema en algún momento?

  • ¿Qué puedo hacer exactamente con el nuevo sistema que no puedo lograr defadvice?

  • ¿Cuál es el significado de poder "agregar / eliminar código en cualquier lugar que lleve funciones"?

Respuestas:


57

El nuevo sistema de asesoramiento tiene las siguientes ventajas:

  • add-function: Esta es una funcionalidad completamente nueva que simplemente no formaba parte del desajuste. Es una especie de híbrido entre add-hooky defadvice. En el futuro, espere más foo-functionvariables (vía modificada add-function) y menos foo-functions(vía modificada add-hook). Esta funcionalidad fue la principal motivación para implementar el nuevo sistema de asesoramiento, desencadenado por un informe de error que preguntaba cómo "compartir" un filtro de proceso entre diferentes paquetes.

  • Simplicidad de implementación: una vez que add-functionse implementó, solo se necesitan 8 KB para implementar la advice-addfuncionalidad, lo que brinda prácticamente toda la funcionalidad de los 100 KB de advice.el.

  • Simplicidad de diseño: el desaconsejo tiene varias nociones que generalmente son difíciles de entender con precisión y / o rara vez se usan. Por ejemplo, la diferencia entre los consejos de "activación" y "activación". O el significado de "pre" y / o "compilado". También hay peculiaridades en el manejo de ad-do-it, como el hecho de que parece una referencia de variable en lugar de una llamada, o el hecho de que necesita (setq ad-return-value ...)explícitamente en lugar de simplemente devolver el valor.

  • Defadvice sufre varios problemas de macroexpansión y compilación de wrt: el cuerpo de un consejo no se expone como "código" (que el compilador y el macroexpansor ven) sino como "datos" que luego se combinan para formar una expresión. Entonces, la macroexpansión ocurre tarde (lo que puede causar sorpresas si usa cosas como (eval-when-compile (require 'foo))) y el alcance léxico es difícil de preservar correctamente.

En cuanto a si necesita cambiar al nuevo sistema: tengo la intención de deshacerme del viejo dispositivo auxiliar en algún momento en el futuro, pero creo que este futuro es relativamente distante (y primero tendrá que mudarse lisp/obsolete, luego más tarde). a GNU ELPA).


1
¿Existen planes para agregar a nadvice.el la misma funcionalidad de modificación de argumentos ofrecida por el antiguo sistema de consejos?
Aaron Miller el

No, eso no tiene mucho sentido en el contexto de nadvice.el, donde las funciones de asesoramiento son simples funciones normales. Pero puede usar :aroundconsejos ( :filter-argso :filter-resultconsejos) para obtener el mismo efecto.
Stefan

2
Sin embargo, no puedo. Supongamos que quiero aconsejar una función de dos argumentos, reemplazando solo el segundo argumento, de modo que la función recomendada todavía se solicitará de acuerdo con su forma interactiva para el primero. Los nuevos consejos parecen proporcionar un par de formas diferentes de reemplazar la forma interactiva de una función recomendada, pero no veo nada que ofrezca más matices que eso.
Aaron Miller

@AaronMiller: Por favor, haga una pregunta SX por separado, para que pueda discutirse sin los límites artificiales de los comentarios SX.
Stefan

Hecho, en emacs.stackexchange.com/q/19233/2162 . Agradezco tu seguimiento. (También me gustaría ver el informe de errores que menciona en su respuesta, pero no he podido encontrarlo a través de Google o en la búsqueda en el archivo de la lista de correo. ¿Le importaría vincularlo?)
Aaron Miller,

9

Uno de los claros beneficios de que el consejo sea una función normal es que puede visitar una definición find-function.

En la actualidad, al ver la ayuda para una función recomendada (nuevo estilo), proporciona un enlace a la ayuda para la función de asesoramiento, y desde allí un enlace a la fuente (como es habitual para la ayuda de la función).

El antiguo sistema proporcionaba el documento docstring en línea, pero no había forma de ver el código (generalmente recurría a rgrep).

(Personalmente, me gustaría ver una combinación de los enfoques antiguos y nuevos para mostrar la ayuda, ya que me gustó tener la cadena de documentación en línea, pero estoy seguro de que es posible en el futuro).


2
Sí, es una pena que el nuevo sistema de consejos no le permita agregar a la cadena de documentos existente como lo defadvicehace. Vea este informe de error de Emacs . Esto es una deficiencia.
Dibujó el

8

Desde el encabezado del archivo:

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

Mientras lo leo, el objetivo principal es ser más simple que el antiguo sistema de consejos, no tener más capacidades. Al leer los documentos, parece que advice-addcontiene un subconjunto de defadvicela funcionalidad de, mientras que add-functioncontiene una buena funcionalidad para aconsejar funciones no tradicionales como los filtros de proceso (que probablemente fue posible con defadvice, pero no estoy seguro de cómo).

Hasta donde yo sé, defadviceno está oficialmente en desuso, por lo que debe sentirse libre de seguir usándolo por ahora (y si es un autor de paquetes, probablemente quiera seguir usándolo hasta que 24.4 sea más ampliamente adoptado). Sin embargo, parece que los autores de Emacs desean migrar por completo al nuevo sistema, por lo que probablemente tenga sentido cambiar lentamente.



Si. Lo nuevo es diferente, no más. Y sí, hay mucho uso defadvicepor ahí (y seguirá siéndolo).
Dibujó el

0

Algo que no he visto mencionado aquí, aunque de alguna manera se debe al enfoque más simple (mejor modularidad y "pegamento") del "nuevo" sistema de asesoramiento, que se ha mencionado en otras respuestas, es esto: es mucho más fácil agregar, combinar, eliminar, reordenar , etc. consejos de asesoramiento.

Incluso es posible hacerlo interactivamente, dinámicamente, aunque nadvice necesita un poco de ayuda para facilitar esto. No conozco otro uso de nadvice de esta manera (composición interactiva de consejos), pero hay al menos una de esas aplicaciones. Lo uso en Isearch + , para permitirle agregar y eliminar combinaciones de predicados de filtro arbitrarios (filtros) de Isearch durante la búsqueda.

IOW, al igual que cambia su patrón de búsqueda de manera incremental, puede refinar su búsqueda sobre la marcha utilizando múltiples filtros.

El filtrado de Isearch se realiza mediante la variable isearch-filter-predicate, que ha estado disponible durante bastante tiempo. Sin embargo, los filtros Isearch no se definen con frecuencia. Suelen ser estáticos y predefinidos para un contexto determinado (por ejemplo, Wdired). No es muy fácil para los usuarios definirlos y usarlos, al menos interactivamente.

Solo hay una variable, isearch-filter-predicatepor lo que cambiar el filtrado realmente significa cambiar el predicado de filtro único, lo que equivale a componer funciones, combinar predicados, limitar, expandir o modificar la búsqueda.

Pero eso es exactamente en lo que nadvice es bueno. En resumen, nadvice es tan útil para combinar funciones que puede facilitar el refinamiento interactivo del filtro de búsqueda. (Consulte Filtrado dinámico de Isearch para obtener más información al respecto).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.