En programación funcional y de aspectos , el consejo describe una clase de funciones que modifican otras funciones cuando estas últimas se ejecutan; es una determinada función, método o procedimiento que se debe aplicar en un punto de unión dado de un programa.
El uso práctico de las funciones de asesoramiento es generalmente modificar o extender de otro modo el comportamiento de funciones que no pueden o no deben modificarse o extenderse fácilmente. Por ejemplo, el complemento Emacspeak de Emacs hace un uso extensivo de los consejos: debe modificar miles de módulos y funciones de Emacs existentes de modo que pueda producir una salida de audio para personas ciegas que corresponda a la presentación visual, pero sería inviable copiarlos todos y redefinirlos para producir una salida de audio además de sus salidas normales; por lo tanto, los programadores de Emacspeak definen funciones de asesoramiento que se ejecutan antes y después.
Para dar un ejemplo sencillo de Emacs: supongamos que después de que un usuario corrigiera una palabra mal escrita utilizando el módulo ispell de Emacs , quisiera volver a corregir la ortografía de todo el búfer. ispell-word
no ofrece esa funcionalidad, incluso si la palabra corregida aparece con frecuencia en el búfer. El usuario podría buscar la definición de ispell-word
, copiarla en sus archivos personales de Emacs y agregar allí la funcionalidad deseada, pero esto es tedioso y, lo que es peor, frágil (la versión del usuario ahora está desincronizada con la implementación principal de Emacs, si es que funciona sin más refactorización). Lo que el usuario quiere es bastante simple: simplemente ejecutar otro comando cada vez que ispell-word
se ejecuta . Con la ayuda de un consejo, se puede hacer de manera tan simple como esto:
( consejo-agrega #' ispell-word :después de #' flyspell-buffer )
Aunque este ejemplo es obviamente trivial, la fuerza de advice, especialmente cuando se compara con facilidades similares como los decoradores de Python y las anotaciones de Java , radica en el hecho de que no solo las funciones/métodos recomendados no necesitan estar diseñados para aceptar consejos, sino que también los consejos en sí mismos no necesitan estar diseñados para ser utilizables como consejos: son solo funciones normales. La disponibilidad de evaluación durante la vida útil de una pieza de código (cf. staging de código ) en Lisp permite que advice se incorpore automáticamente en cualquier otro código de diversas formas. Se puede recomendar a cualquier pieza de código que realice cualquier otro cálculo antes, después, alrededor o en lugar de su definición original.
Los consejos pueden generar confusión, ya que un consejo aplicado a una función no es evidente para un usuario que busca la definición de origen de la función para conocerla. En tales casos, los consejos actúan casi como un COMEFROM , una función de broma añadida a INTERCAL para burlarse de la espaguetificación que acompaña al uso extensivo de GOTOs . Sin embargo, en la práctica, estos problemas rara vez se presentan. Los desarrolladores y mantenedores de paquetes y módulos de Lisp nunca utilizan consejos, ya que no hay ninguna ventaja que obtener al aconsejar funciones cuando sus definiciones de origen originales se pueden reescribir libremente para incluir las características deseadas. Los consejos solo son útiles porque permiten a los usuarios posteriores modificar posteriormente el comportamiento predeterminado de una manera que no requiere la propagación de dichas modificaciones en la definición de origen de la implementación principal.
Una forma de consejos formaba parte de C con las clases a finales de los años 1970 y principios de los años 1980, es decir, funciones llamadas call
y return
definidas en una clase, que se llamaban antes (respectivamente, después) de las funciones miembro de la clase. Sin embargo, estas se eliminaron de C++ . [1]
Los consejos son parte del Sistema de objetos Common Lisp (CLOS), como los métodos :before
, :after
, y :around
, que se combinan con el método principal en la "combinación de métodos estándar". [2]
Las implementaciones de Common Lisp proporcionan funciones de asesoramiento (además de la combinación de métodos estándar para CLOS) como extensiones. LispWorks [3] admite funciones de asesoramiento, macros y métodos CLOS.
EmacsLisp agregó código relacionado con consejos en la versión 19.28, 1994.
Lo que sigue es un extracto de una discusión en la lista de correo aosd-discuss. Pascal Costanza contribuyó con lo siguiente:
El término "advice" se remonta al término advising (consejo) , introducido por Warren Teitelman en su tesis doctoral en 1966. A continuación, se incluye una cita del capítulo 3 de su tesis:
El "asesoramiento" encontró su camino en BBN Lisp y más tarde en Interlisp de Xerox PARC .
También llegó a Flavors , la primera extensión orientada a objetos de Lisp desarrollada en el MIT . Se incluyeron bajo la noción de combinación de métodos. [4] [a]
Dado que la combinación de métodos y las macros están estrechamente relacionadas, también es interesante notar que el primer sistema de macros se describió en 1963, tres años antes de la tesis doctoral de Warren Teitelman. [5] [b]
Gregor Kiczales comenta lo anterior de la siguiente manera: