En aspecto y la programación funcional , consejos describe una clase de funciones que modifican otras funciones cuando es ejecutado el último; es una determinada función, método o procedimiento que se aplicará en un punto de unión dado de un programa.
Usar
El uso práctico de las funciones de aviso es generalmente para modificar o ampliar el comportamiento de funciones que no se pueden modificar o ampliar fácilmente. El Emacspeak Emacs -addon hace un amplio uso de los consejos: debe modificar miles de módulos y funciones, que puede producir una salida de audio para ciegos que corresponde a la presentación visual de Emacs existente, pero sería inviable para copiar todos ellos y volver a definirlos para producir una salida de audio además de sus salidas normales; por tanto, los programadores de Emacspeak definen funciones de asesoramiento que se ejecutan antes y después.
Otro ejemplo de Emacs; supongamos que después de corregir una palabra mal escrita a través de ispell , se desea volver a revisar la ortografía de todo el búfer. ispell-word
no ofrece tal funcionalidad, incluso si la palabra corregida se usa mil veces. Uno podría rastrear la definición de ispell-word
, copiarla en su Emacs y escribir la funcionalidad adicional, pero esto es tedioso, propenso a fallar (la versión de Emacs se desincronizará con el módulo Ispell Elisp real, si es que funciona fuera de su casa). Lo que uno quiere es bastante simple: simplemente ejecutar otro comando después de ispell-word
ejecutarlo. Utilizando las funciones de asesoramiento, se puede hacer de la siguiente manera:
( defadvice ispell ( después del consejo ) ( flyspell-buffer )) ( ad-active 'ispell t )
Implementaciones
Una forma de consejos formaba parte de C con Clases a fines de la década de 1970 y principios de la de 1980, a saber, 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, estos se eliminaron de C ++ . [1]
Los consejos son parte del Common Lisp Object System (CLOS), como :before
, :after
y :around
métodos, que se combinan con el método principal en "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 agregó código relacionado con los consejos en la versión 19.28 , 1994.
Historia
Lo siguiente está extraído de una discusión en la lista de correo aosd-discus . Pascal Costanza contribuyó con lo siguiente:
El término "asesoramiento" se remonta al término asesoramiento tal como lo introdujo Warren Teitelman en su tesis doctoral en 1966. Aquí hay una cita del Capítulo 3 de su tesis:
- El asesoramiento es la innovación básica en el modelo y en el sistema PILOT. El asesoramiento consiste en insertar nuevos procedimientos en cualquiera o en todos los puntos de entrada o salida de un procedimiento en particular (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 particular, esto significa que la ejecución de un aviso puede hacer que el procedimiento que modifica se omita por completo, por ejemplo, especificando como salida del aviso una de las salidas del procedimiento original; o el consejo puede cambiar variables esenciales y continuar con el cálculo para que se ejecute el procedimiento original, pero con variables modificadas. Finalmente, el aviso no puede alterar la ejecución o afectar el procedimiento original en absoluto, por ejemplo, puede simplemente realizar algún cálculo adicional, como imprimir un mensaje o registrar el historial. Dado que el asesoramiento puede ser condicional, la decisión sobre lo que se debe hacer puede depender de los resultados del cálculo hasta ese momento.
- La principal ventaja de la asesoría es que el usuario no necesita preocuparse por los detalles de los cambios reales en su programa, ni por la representación interna de la asesoría. Puede tratar el procedimiento a ser asesorado _ como una unidad_, un solo bloque, y realizar cambios en él sin preocuparse por los detalles de este bloque. Esto puede contrastarse con la edición en la que el programador debe conocer la estructura interna del procedimiento.
"Asesoramiento" encontrado su camino en BBN Lisp y más tarde en el Xerox PARC 's Interlisp .
También encontró su camino hacia Flavours , la primera extensión orientada a objetos de Lisp desarrollada en el MIT . Fueron subsumidos 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 macro se describió en 1963, tres años antes de la tesis doctoral de Warren Teitelman. [5] [b]
Ver también
Notas
Gregor Kiczales comenta lo anterior de la siguiente manera:
- ^ Los consejos aparecieron por separado de Flavours en Maclisp y Lisp Machine . Podrías aconsejar cualquier función, al igual que en Interlisp en ese momento. La ontología antes / después apareció por separado en los métodos de Flavours.
- ^ La combinación de métodos y las macros solo se relacionaron marginalmente hasta mucho más tarde, en New Flavors y CLOS , cuando se proporcionó un mecanismo similar a una macro para permitir que las personas definieran sus propias reglas para combinar métodos. Antes de eso, se arreglaron las reglas que gobiernan la combinación de métodos antes / después y los llamados métodos whoppers (around), y el compilador solo generó el código para eso. Había cosas llamadas envolturas, que tenían un comportamiento similar a una macro, pero olvido cuándo aparecieron. Recorrer las distintas versiones del manual de MacLisp y Lispm para obtener esta parte de la historia exactamente correctamente podría ser interesante. O podría ser que Howard Cannon o David Moon o alguien realmente pudiera recordarlo todo exactamente.
Referencias
- ^ El diseño y la evolución de C ++, p. 57
- ^ "Una breve guía de CLOS" . Archivado desde el original el 6 de mayo de 2015 . Consultado el 27 de abril de 2015 .
- ^ Guía del usuario y manual de referencia de LispWorks 7, la función de asesoramiento
- ^ Véase, por ejemplo, AIM-602 en https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0600browse.shtml
- ^ Ver AIM-57 en https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0000browse.shtml
enlaces externos
- Tesis doctoral de Teitelman (AITR-221)
- Manual de referencia de Interlisp de 1974
- "Origen de los consejos"