Articulo de referencia

Consejos (programación)

En la programación funcional y en aspectos , un consejo describe una clase de funciones que modifican otras funciones cuando estas últimas se ejecutan; es una función, método o ...

En la programación funcional y en aspectos , un consejo describe una clase de funciones que modifican otras funciones cuando estas últimas se ejecutan; es una función, método o procedimiento determinado que se debe aplicar en un punto de unión específico de un programa.

Usar

El uso práctico de las funciones de asesoramiento consiste generalmente en modificar o ampliar el comportamiento de funciones que no pueden o no deben modificarse o ampliarse fácilmente. Por ejemplo, el complemento Emacspeak de Emacs hace un uso extensivo de las funciones de asesoramiento: debe modificar miles de módulos y funciones de Emacs existentes para 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 que produzcan 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 un ejemplo sencillo de Emacs: supongamos que después de que un usuario corrigiera una palabra mal escrita usando el módulo ispell de Emacs , quisiera volver a revisar la ortografía de todo el búfer. ispell-wordno ofrece tal 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 la funcionalidad deseada allí, pero esto es tedioso y, peor aún, frágil (la versión del usuario ahora está desincronizada con la implementación principal de Emacs, si es que funciona sin una refactorización adicional). Lo que el usuario quiere es bastante simple: simplemente ejecutar otro comando cada vez ispell-wordque se ejecuta . Usando consejos, se puede hacer de forma tan simple como esto:

( advice-add #' ispell-word :after #' flyspell-buffer )

Aunque este ejemplo es obviamente trivial, la fuerza de la sugerencia, especialmente en comparación con herramientas similares como los decoradores de Python y las anotaciones de Java , reside en el hecho de que no solo las funciones/métodos sugeridos no necesitan estar diseñados para aceptar sugerencias, sino que las sugerencias en sí mismas no necesitan estar diseñadas para ser utilizables como tales; son simplemente funciones normales. La disponibilidad de evaluación durante todo el ciclo de vida de un fragmento de código (véase la preparación de código ) en Lisp permite que las sugerencias se inserten automáticamente en cualquier otro código de diversas maneras. Cualquier fragmento de código puede recibir sugerencias para realizar cualquier otro cálculo antes, después, alrededor o en lugar de su definición original.

Legibilidad

El consejo puede generar confusión, ya que un consejo aplicado a una función no resulta evidente para un usuario que consulta la definición fuente de la función para comprenderlo. En estos casos, el consejo actúa casi como un COMEFROM , una función de broma añadida a INTERCAL para parodiar la complejidad que conlleva el uso extensivo de GOTO . Sin embargo, en la práctica, estos problemas rara vez se presentan. Los desarrolladores y mantenedores de paquetes y módulos Lisp nunca utilizan el consejo, puesto que no hay ninguna ventaja en aconsejar funciones cuando sus definiciones fuente originales pueden reescribirse libremente para incluir las características deseadas. El consejo solo es útil en la medida en que permite a los usuarios posteriores modificar el comportamiento predeterminado sin necesidad de propagar dichas modificaciones a la definición fuente de la implementación principal.

Implementaciones

A finales de la década de 1970 y principios de la de 1980, C con clases incluía una forma de consejos , concretamente funciones definidas cally returnllamadas dentro de una clase, que se ejecutaban antes (o después) de las funciones miembro de la clase. Sin embargo, estos consejos se eliminaron de C++ . [ 1 ]

Los consejos forman parte del Common Lisp Object System (CLOS), como métodos :before, :after, y :around, que se combinan con el método principal bajo la "combinación de métodos estándar". [ 2 ]

Las implementaciones de Common Lisp proporcionan funcionalidad 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 añadió código relacionado con consejos en la versión 19.28 , de 1994.

Historia

Lo siguiente se extrae de una discusión en la lista de correo aosd-discuss . Pascal Costanza aportó lo siguiente:

El término "asesoramiento" se remonta al término " asesoramiento " introducido por Warren Teitelman en su tesis doctoral en 1966. He aquí una cita del capítulo 3 de su tesis:

El asesoramiento es la innovación fundamental del modelo y del sistema PILOT. Consiste en insertar nuevos procedimientos en cualquiera o en todos los puntos de entrada o salida de un procedimiento específico (o clase de procedimientos). Los procedimientos insertados se denominan «procedimientos de asesoramiento» o simplemente «asesoramiento».
Dado que cada consejo es en sí mismo un procedimiento, tiene sus propias entradas y salidas. En concreto, esto significa que la ejecución de un consejo puede provocar que el procedimiento que modifica se omita por completo, por ejemplo, especificando como salida del consejo una de las salidas del procedimiento original; o bien, el consejo puede cambiar variables esenciales y continuar con el cálculo, de modo que se ejecute el procedimiento original, pero con variables modificadas. Por último, el consejo puede no alterar la ejecución ni afectar en absoluto al procedimiento original; por ejemplo, puede simplemente realizar algún cálculo adicional, como imprimir un mensaje o registrar el historial. Dado que los consejos pueden ser condicionales, la decisión sobre qué hacer puede depender de los resultados del cálculo hasta ese momento.
La principal ventaja de la función de asesoramiento es que el usuario no necesita preocuparse por los detalles de los cambios en su programa ni por la representación interna del asesoramiento. Puede tratar el procedimiento que se va a asesorar como una unidad , un único bloque, y modificarlo sin preocuparse por los detalles de dicho bloque. Esto contrasta con la edición, en la que el programador debe conocer la estructura interna del procedimiento.

El término "advising" se incorporó a BBN Lisp y más tarde a Interlisp de Xerox PARC .

También llegó a Flavors , la primera extensión orientada a objetos de Lisp desarrollada en el MIT . Se englobaron 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 observar que el primer sistema de macros se describió en 1963, tres años antes de la tesis doctoral de Warren Teitelman. [ 5 ] [ b ]

Véase también

Notas

Gregor Kiczales comenta lo anterior de la siguiente manera:

  1. El asesoramiento aparecía separado de los sabores en Maclisp y la máquina Lisp . Se podía asesorar sobre cualquier función, al igual que en Interlisp en aquel entonces. La ontología before/after aparecía por separado en los métodos de Flavors.
  2. La combinación de métodos y las macros solo estuvieron marginalmente relacionadas hasta mucho más tarde, en New Flavors y CLOS , cuando se proporcionó un mecanismo similar a las macros para permitir a los usuarios definir sus propias reglas para combinar métodos. Antes de eso, las reglas que regían la combinación de métodos before/after y los llamados métodos whoppers (around) eran fijas, y el compilador simplemente generaba el código para ello. Existían los llamados wrappers, que tenían un comportamiento similar al de las macros, pero no recuerdo cuándo aparecieron. Repasar las distintas versiones de los manuales de MacLisp y Lispm para obtener esta parte de la historia con exactitud podría ser interesante. O tal vez Howard Cannon, David Moon o alguien más podría recordarlo todo con precisión.

Referencias

  1. El diseño y la evolución de C++, pág. 57
  2. "Una breve guía sobre CLOS" . Archivado del original el 6 de mayo de 2015. Consultado el 27 de abril de 2015 .
  3. Guía del usuario y manual de referencia de LispWorks 7, The Advice Facility
  4. Véase, por ejemplo, AIM-602 en https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0600browse.shtml
  5. Véase AIM-57 en https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0000browse.shtml
  • Tesis doctoral de Teitelman, PILOT: Un paso hacia la simbiosis hombre-ordenador (AITR-221)
  • Manual de referencia de Interlisp de 1974.
  • "Origen del consejo"