¿Qué problema práctico resulta de la falta de macros higiénicas en Clojure?

11

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:

  1. ¿Cómo gensymdifiere de las macros higiénicas?
  2. ¿Qué proporcionan las macros de Racket que no ofrecen Clojure? (ya sea seguridad, composibilidad o cualquier cosa)
Alex
fuente
2
Las macros higiénicas son macros cuya expansión está garantizada para no causar la captura accidental de identificadores. El problema general de la captura accidental era bien conocido dentro de la comunidad de Lisp antes de la introducción de las macros higiénicas. Los escritores de macros usarían características de lenguaje que generarían identificadores únicos (por ejemplo, gensym) o usarían identificadores ofuscados para evitar el problema. Las macros higiénicas son una solución programática para el problema de captura que se integra en el propio expansor de macros. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey
3
Debido a que el sistema macro higiénico [de Racket] tiene un conocimiento profundo de cómo funciona su macro, su macro está extremadamente bien integrada en el entorno: el resaltado de sintaxis funciona correctamente, el cambio de nombre automático de variables funciona correctamente, las referencias cruzadas funcionan correctamente, y también lo hacen todos los demás slick [Racket] IDE características. En otras palabras, la higiene no solo lo protege contra errores simples como la captura de variables, sino que permite que su código sea analizado formalmente por herramientas que simplemente no podrían existir para Common LISP. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Respuestas:

6

La ventaja de las macros higiénicas no es la capacidad del lenguaje: puede escribir macros que tengan una buena higiene usando gensymy 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-casese 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.

Nathan Davis
fuente
2
gensymevita 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 redefinir ifo 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)
Phil
2
Las macros antihigiénicas son ciertamente útiles. No estoy seguro acerca de Scheme, pero Racket tiene muchas operaciones de "flexión de higiene". Las macros del lenguaje son higiénicas por defecto. Simplemente te hacen muy consciente cuando rompes la higiene.
Phil