He oído que las macros Clojure son más fáciles de escribir pero no tan confiables como las macros higiénicas de Racket. Mi pregunta tiene 2 partes:
- ¿Cómo
gensym
difiere de las macros higiénicas? - ¿Qué proporcionan las macros de Racket que no ofrecen Clojure? (ya sea seguridad, composibilidad o cualquier cosa)
Respuestas:
La ventaja de las macros higiénicas no es la capacidad del lenguaje: puede escribir macros que tengan una buena higiene usando
gensym
y entrecomillando / desarmando cuidadosamente en los momentos correctos. Sin embargo, las macros higiénicas aseguran que sus macros tengan una buena higiene. En ese sentido, es un poco como la verificación de tipos.También puede haber ventajas de herramientas para las macros higiénicas. La mayoría de los macro sistemas higiénicos imponen controles estrictos sobre lo que hace su macro y cómo lo hace (por ejemplo, no puede ejecutar código arbitrario cuando
syntax-case
se expande una macro definida por Scheme's ). Esto puede facilitar la escritura de programas que "entienden" su macro y puede proporcionar soporte adicional para herramientas.Por otro lado, hay algunos casos en los que las macros antihigiénicas pueden ser útiles. Por ejemplo, si realmente desea capturar un enlace para una variable específica (por ejemplo, macros anafóricas ), entonces creo que no tiene suerte si solo tiene macros higiénicas.
fuente
gensym
evita que la macro se meta accidentalmente con el usuario de la macro, pero no evita que el usuario de la macro se meta con la macro. Por ejemplo, un usuario macro puede redefinirif
o algo así. (La pregunta "por qué alguien haría eso" es irrelevante. Este es un ejemplo simple que demuestra que es posible, y es difícil razonar sobre macros no higiénicas)