lisp reader-macro

lisp - Leer macros: ¿para qué los usas?



reader-macro (7)

Estoy tratando de tener una idea de las partes de Lisp que no he usado mucho hasta ahora. Las macros leídas han llamado mi atención en este momento. No hay una gran cantidad de información sobre su uso y sería útil ver lo que las personas han hecho con ellos, tanto para obtener ejemplos de cómo funcionan como para ver qué tipo de problemas se pueden abordar con ellos. Siguiendo con eso, ¿existen pautas para saber qué constituye un uso bueno y malo de las macros de lectura?


Aunque utilizo muchas macros, nunca he encontrado la necesidad de usar macros de lectura, aparte de la experimentación casual. Si ayuda, en "Let Over Lambda" encontrará una extensa discusión sobre ellos: http://letoverlambda.com/index.cl/toc


En realidad tiendo a evitarlos por mi código Lisp ordinario; Recientemente, incluso me encontré rechazando una biblioteca de terceros debido a su uso de macros de lector. Esto se debe principalmente al hecho de que, a diferencia de los símbolos, solo hay un "espacio de nombres" para las macros de lector. Y a menudo parece que no estoy de acuerdo con los autores de las bibliotecas sobre su gusto al elegir un personaje de envío apropiado.

Sin embargo, utilicé lecturas personalizadas no estándar + lectura exitosa para tareas de análisis simples. El analizador más complejo que implementé usando una tabla de lectura personalizada fue un motor de plantillas HTML (otro más, lo siento) con una sintaxis similar a JSP / ASP, pero usando Common Lisp como el lenguaje de la plantilla real, para que pueda tener cosas como

<% (for (title . link) in breadcrumb do %><a href="<%= link %>"><%= title %></a><% ) %>

(aunque no se hizo solo con hacks legibles, el código tuvo que someterse a una etapa de preprocesamiento).


Las expresiones S son la sintaxis de Lisp para los datos de Lisp. Las expresiones S se leen con la función LEER y las macros de lectura son la forma integrada de Lisp de ampliar el lector. Esto significa que el uso más directo de las macros de lectura es implementar la sintaxis de datos predefinida y abrir posibilidades para cambiar o ampliar la forma en que Lisp lee las expresiones en s.

Lisp viene con una sintaxis externa predefinida para una gran cantidad de tipos de datos: símbolos, números, cadenas, matrices, caracteres, ventajas, listas, estructuras y más. Permite imprimir y leer los objetos de datos.

  1. Lisp carece de sintaxis para otros tipos de datos, como tablas hash y objetos CLOS. Entonces, el primer uso de las macros de lectura en el código de usuario sería extender el lector para poder leer estructuras de datos como tablas hash, vectores paralelos, nuevos tipos de números, ... básicamente, cada tipo de datos que el desarrollador desea tener una sintaxis externa que se puede leer de nuevo.

  2. Dado que Lisp usa las expresiones s también para el código, el segundo uso de las macros de lectura es extender la notación para los programas Lisp. Un ejemplo típico es el uso de [y] para escribir código de SQL incorporado. La sintaxis habitual de Lisp es similar, pero el uso de [y] ayuda a que las expresiones SQL sobresalgan en el código. Otro ejemplo es utilizar macros de lectura para proporcionar identificadores para lenguajes de programación integrados, como constantes de Objective C, mensajes, etc. Identificadores externos disponibles.

  3. El tercer uso es incrustar diferentes sintaxis en la sintaxis de Lisp. Un viejo ejemplo de esto es la macro de lectura de infijo, que permite expresiones de infijo incrustadas. Otros ejemplos son la sintaxis HTML o XML incrustada, o fragmentos incrustados de otras sintaxis de lenguaje de programación.

  4. A veces, las macros leídas se usan para implementar otros lenguajes (relacionados) que usan sintaxis de expresión s que son diferentes de la sintaxis de Common Lisp predefinida. Un ejemplo sería un lector para las expresiones s de Scheme, que son ligeramente diferentes de Common Lisp.


Las macros de Reader se utilizan cuando hay una sintaxis para los objetos literales que es posible que desee tener. El único problema con ellos es el espacio de nombres plano para los posibles sintácticos (sin embargo, hay formas de solucionarlo). No hay tantos usos de macros de lector. Algunos ejemplos que me vienen a la mente son:


Tengo dos pequeños proyectos en Github que muestran cómo y por qué uno podría querer usar macros de lector en Common Lisp. Estos son SHELLSHOCK y BOXEN . Como se mencionó en otras respuestas, http://weitz.de/cl-interpol/ es un ejemplo sobresaliente y útil.

Si estos son buenos usos de las macros de lectores es obviamente subjetivo, pero seguramente debo pensar que son útiles o ¡no habría escrito el código!


Una sintaxis alternativa particularmente común y útil que puede incrustar con macros de lectura es la sintaxis de expresiones regulares. No es nada difícil implementarlo, ya que solo está leyendo una cadena con diferentes reglas de escape, pero si usa expresiones regulares con frecuencia, realmente puede ser rentable. La biblioteca http://weitz.de/cl-interpol/ que mencionó dmitry-vk proporciona esta funcionalidad, junto con muchas otras características.