¿Cuáles son las aplicaciones típicas de las macros Lisp?

19

Estoy tratando de aprender algo de LISP y he leído mucho sobre la importancia de las macros de LISP, por lo que me gustaría adquirir experiencia laboral con ellas.

¿Puede sugerir un área de aplicación práctica que me permita usar macros para resolver un problema del mundo real y comprender la utilidad de esta construcción de programación?

NOTA

Este no es un proyecto genérico, ¿qué debo hacer en la próxima pregunta? Estoy interesado en comprender qué tipos de problemas se resuelven típicamente mediante macros LISP. Por ejemplo, ¿son buenos para implementar tipos de datos abstractos? ¿Por qué se agregó esta construcción al lenguaje? ¿Qué tipo de problemas resuelve que no se pueden resolver mediante funciones simples?

Giorgio
fuente

Respuestas:

9

Las macros de Lisp combinan algunas propiedades distintas:

  1. Las macros definen una nueva sintaxis ↔ usan el código fuente como entrada
  2. Las macros generalmente se ejecutan en tiempo de compilación
  3. Las macros generan código fuente

Las mejores aplicaciones hacen uso de todos esos aspectos. Probablemente el ejemplo más conocido es el (bucle ...) en Common Lisp, no estaría cerca de su utilidad sin una de esas características. Sin la fuente como entrada, sería incómodo definir las acciones dentro del ciclo; sin expansión en tiempo de compilación sería demasiado lento; y sin generación de código no sería ejecutable.

Otro buen ejemplo es el capítulo de serialización binaria en Practical Common Lisp , Practical: Parsing Binary Files .

Una macro de consulta que implementa algo similar a LINQ podría ser otra buena aplicación. Pero faltaría el autocompletado que hace que LINQ sea tan bueno como es. Casi todo lo que hoy se resuelve mediante generadores de códigos de propósito especial con entradas XML (por ejemplo, XAML) también podría implementarse utilizando macros Lisp.

Patricio
fuente
Acabo de comprar el libro "Practical Common Lisp", voy a echar un vistazo al ejemplo que ha sugerido.
Giorgio
2

La forma en que me gusta pensar sobre las macros en lisp común es que son funciones que devuelven el código a evaluar, pero 'no' evalúan sus argumentos antes de devolver ese código. Las funciones también devuelven algo, pero evalúan cada argumento antes de evaluar su cuerpo. Las macros no.

Paul Graham en 'On Lisp' proporciona (en mi humilde opinión) una de las mejores descripciones de las diferencias entre macros y funciones, y analiza su superposición y singularidad. Muchos bits de código se pueden escribir como una función o una macro, pero hay casos en los que solo funcionará una macro. Una vez que lo entiendes, creo que tienes la esencia de las macros en ceceo.

Como ejemplo de una macro en la que una función no funcionará, consulte 'aif' (anafórico si). Son solo unas pocas líneas de código, y mi recomendación sobre dónde comenzar.

Y haga referencia a la versión de Common Lisp de anafórico si, que aprovecha la captura intencional de variables. La versión higiénica automática de Scheme no es IMO, el "trato real". La captura variable es una parte importante de la macrología de lisp, y algunas de las macros más potentes y útiles ciertamente la aprovechan.

Clayton Stanley
fuente