macros scheme racket

Raqueta vs macros de esquema



scheme racket (3)

¿Las macros de raqueta tienen una funcionalidad más avanzada que las que se encuentran en Scheme o Common Lisp? Sospecho que sí, especialmente con respecto a los módulos, los espacios de nombres y el alcance, etc., pero apreciaría un simple resumen de lo que pueden hacer las macros de Raqueta, en todo caso, que otras trampas no pueden.

Además, Scheme / CL también expone la capa del lector al desarrollador, y al usar esto, ¿no es posible en esos lisps crear lenguajes completamente nuevos (no solo macros de s-expr), como Scribble, como puede hacerlo en Racket?

En otras palabras, ¿es Racket simplemente una filosofía / convención sobre "programación orientada al lenguaje" con envoltorios sintácticos convenientes para este fin, o es más fundamental que Scheme haga cosas técnicamente imposibles en ese idioma?

Muchas gracias.


Dos características clave que hacen que la "programación orientada al lenguaje" funcione en Racket son:

  • El sistema de módulos permite la especificación de un lenguaje base.
  • macros sensibles al contexto

La primera bala es básicamente lo que hace #lang . Tener el sistema de módulos a cargo de configurar el lector y los enlaces disponibles en un módulo dado permite el uso fácil de diferentes idiomas. Sin esto, sería más complicado trabajar con lenguajes como Scribble o at-exp .

La segunda es que Racket proporciona macros sensibles al contexto que se pueden sobrepasar, como #%app , #%module-begin , etc., que permiten la personalización de, por ejemplo, cada aplicación de función dentro de un módulo o de todo el módulo. Esto permite agregar, por ejemplo, un pase de comprobación de tipo sobre todo el módulo.

Esta no es una lista exhaustiva de características que ayudan a crear idiomas en Racket. Si está interesado en leer más sobre esto, vale la pena leer el documento "Idiomas como bibliotecas" .



Vea también la respuesta de Matthew para la misma pregunta después de que @Scott lo publicó en la lista, con un documento de resumen más reciente.