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" .
Le recomendaré que lea el documento "Macros compilables y compilables: ¿cuándo lo desea?" por Matthew Flatt.
Explica cómo las macros y los módulos trabajan juntos en Racket.
Luego implemente un lenguaje pequeño en Racket, por ejemplo, TinyBasic. Entonces compare con los otros idiomas.
ACTUALIZAR
http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf
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.