una tipos sirve que para macro hacer ejemplos como macros lisp scheme common-lisp

macros - tipos - que es una macro en excel



¿Cuáles son las ventajas de las macros de esquema? (3)

¿Por qué alguien preferiría las macros de Scheme sobre las macros de Common Lisp (y realmente quiero saber también, no estoy tratando de ser un troll)?

Mi experiencia como Lisb newb es que las macros de estilo Common Lisp son mucho más fáciles de aprender que las macros de Scheme. Aún no he visto ninguna ventaja en las macros de Scheme, pero, por supuesto, eso no significa que no existan.

Sé que las macros de Scheme son "higiénicas", pero aún no estoy convencido de que valga la pena la complejidad adicional. Por otro lado, obviamente hay personas que están convencidas de que esto es necesario, de lo contrario no habría implementaciones de macros Scheme en Common Lisp.

Para abreviar, ¿alguien puede defenderme las macros de Scheme?


Las macros de esquema introducen dos conceptos esencialmente ortogonales: higiene y coincidencia de patrones. La higiene es menos importante en un lisp2 como Common Lisp. El lenguaje de coincidencia de patrones captura muchas de las expresiones idiomáticas comunes, pero tiene el problema de que es esencialmente un lenguaje diferente del esquema. Probablemente la mejor introducción a las macros del esquema, junto con algunos de los fundamentos detrás de ellos, son los capítulos 36 y 37 de Shriram Krishnamurthi PLAI .

Sospecho que la razón por la que las personas escriben macro sistemas de estilo de esquema en el ceceo común es más para la coincidencia de patrones que para la higiene.


Debido a que usan un lenguaje diferente, no Scheme, las macros Scheme son menos poderosas que las macros Common Lisp en el sentido casi formal: puede hacer un cálculo arbitrario en tiempo de compilación con ellas, pero es peludo y complicado. ¡Se parece mucho al argumento de no usar el set! : conjunto menos poderoso set! los idiomas libres producen menos código defectuoso a cambio de un manejo incómodo del estado. Cada vez que intercambias poder por disciplina, estás apostando a que podrás construir sistemas más complejos a largo plazo.

Ese es el mejor argumento que he visto para las macros de Scheme sobre las de Common Lisp: si estás construyendo un lenguaje complejo sobre Scheme, es menos probable que introduzcas sutiles errores si sigues con el sistema macro estándar.

Personalmente, no construyo grandes lenguajes usando macros, entonces prefiero las macros de Common Lisp. Los encuentro mucho más fáciles para trabajos pequeños y evitar la captura de variables, etc. no es un gran problema a pequeña escala.


Las macros de esquema conservan la transparencia referencial .

Citando el "Manual de referencia Guile" 6.10.2.2 Higiene:

las macros de reglas de sintaxis (...) conservan la transparencia referencial. Cuando lee una definición de macro, cualquier enlace libre en esa macro se resuelve en relación con la definición de macro; y cuando lee una macro instanciación, todos los enlaces libres en esa expresión se resuelven con relación a la expresión.

Esta propiedad a veces se conoce como higiene, y ayuda en la limpieza del código. En las definiciones de macro, puede introducir variables temporales sin preocuparse por introducir inadvertidamente enlaces en la macro expansión.

El esquema estándar ofrece syntax-rules syntax-case y syntax-case .