Desde mi experiencia, las macros causan la mejor impresión en las personas cuando ven cómo ayuda a producir el código, que no se puede hacer mediante los procedimientos u otras construcciones. Muy a menudo estas cosas pueden describirse como:
<common code>
<specific code>
<other common code>
donde <common code>
es siempre la misma. Estos son algunos ejemplos de dicho esquema:
1. La macro time
. código en un lenguaje sin macros se verá algo como esto:
int startTime = getCurrentTime();
<actual code>
int endTime = getCurrentTime();
int runningTime = endTime - startTime;
no se puede poner todo el código común de procedimiento, ya que se envuelve alrededor de código real. (OK, puede hacer un procedimiento y pasar el código real en la función lambda, si el idioma lo admite, pero no siempre es conveniente).
Y, a medida que más probablemente sabe, en Lisp que acaba de crear time
macro y pasar a código real que:
(time
<actual code>)
2. Transacciones. Solicite al programador de Java que escriba el método para SELECT
simple con JDBC; tomará de 14 a 17 líneas e incluirá el código para abrir la conexión y transacción, cerrarlas, varias declaraciones try-catch-finally
anidadas y solo 1 o 2 líneas de código único.
En Lisp simplemente escriba macro with-connection
y reduzca el código a 2-3 líneas.
3. Sincronización. OK, Java, C# y la mayoría de los lenguajes modernos ya tienen afirmaciones para él, pero ¿qué hacer si su lenguaje no tiene una construcción así? ¿O si desea introducir un nuevo tipo de sincronización como STM? Nuevamente, debe escribir una clase separada para esta tarea y trabajar con ella manualmente, es decir, poner un código común alrededor de cada enunciado que quiera sincronizar.
Estos fueron solo algunos ejemplos. Puede mencionar macros "sin olvidar" como with-open
series, ese entorno de limpieza y protegerlo de filtraciones de recursos, nuevas macros de construcciones como cond
en lugar de if
s, y, por supuesto, no se olvide de construcciones vagas como if
, or
y and
, que no evalúan sus argumentos (en oposición a la aplicación de procedimiento).
Algunos programadores pueden abogar por que su lenguaje tenga una tecnología para tratar este o aquel caso (ORM, AOP, etc.), pero pregúnteles si todas estas tecnologías serían necesarias si existieran macros.
Por lo tanto, tomándolo en conjunto y respondiendo la pregunta original sobre cómo explicar las macros. Tome cualquier código ampliamente usado en Java (C#, C++, etc.), transfórmelo en Lisp y luego vuelva a escribirlo como una macro.
Relacionados: http://stackoverflow.com/questions/267862/what-makes-lisp-macros-so-special – jball
Creo que una de las mejores introducciones a las macros es en [Practical Common Lisp] (http: // gigamonkeys.com/book/practical-a-simple-database.html). Es uno de los primeros capítulos, por lo que no asume demasiado, y no es tan largo. Todo el libro es excelente, muy recomendable para cualquier persona, programador "genérico" o no (¡también hay capítulos sobre programación genérica!). – spacemanaki