2010-06-14 18 views
14

Quiero hacer algunas metaprogramaciones en un lenguaje estáticamente tipado, donde se escribirán mis programas y mis metaprogramas. Quiero decir esto en un sentido fuerte: si mi generador de programas se compila, quiero que el sistema de tipos sea lo suficientemente fuerte como para que solo se puedan generar programas de tipo correcto.Lenguajes de metaprogramación mecanografiados

Por lo que sé, solo metaocaml puede hacerlo. (No, ni las plantillas de Template Haskell ni las de C++ se ajustan a la factura; consulte this paper). Pregunta: ¿qué otros idiomas/sistemas permiten esto?

EDITAR: Por lo que yo sé, metaocaml está muerto. Oleg tried to resurrect it, pero eso todavía está atascado varias versiones detrás de OCaml. Si uno quiere ir con lenguajes experimentales (es decir, incluso más que metaocaml, parece que Ur y muy posiblemente Idris se ajustaba perfectamente. Cualesquiera otras nuevas entradas al campo?

+1

¿Hay alguna pregunta? – Ken

+3

@Ken: sí, dame idiomas/sistemas que lo permitan. Editaré la pregunta (aunque veo que 2 contestadores me entendieron perfectamente). –

+1

Tenía la intención de comentar, con respecto a TH, que [este tema apareció en la lista de correo de Haskell-cafe] (http://www.haskell.org/pipermail/haskell-cafe/2010-April/075753.html) un poco mientras estaba de vuelta, pero después de encontrar el hilo parece que, por razones obvias, no proporciona ayuda para responder a esta pregunta ... –

Respuesta

6

F # puede hacer esto también a través Code Quotations.

+0

* Verifica * las citas (en ausencia del contexto de la aplicación), * y * su aplicación. Es fácil de creer que hace una comprobación de sintaxis. –

+2

Sí, el tipo también comprueba la aplicación, si eso es lo que estás preguntando. P.ej. 'let x = <@square [email protected]>', aquí x tiene el tipo 'Expr '. La evaluación de la expresión se realiza mediante AST-rewrite. – Stringer

8

Para hacer eso, debe asegurarse de que el sistema de tipos del lenguaje subyacente sea respetado/comprobado directamente por el metaprograma en sí. Como una cuestión práctica, esto casi fuerza a la metaprogramación a estar en el lenguaje subyacente ... así que supongo No estoy sorprendido de que puedas hacer esto en metaocaml.

La mayoría de nosotros no tenemos herramientas de metaprogramación integradas al lenguaje subyacente (C++ es más bien una excepción, y lo rechazo y los sistemas basados ​​en la reflexión son demasiado débiles para llevar a cabo transformaciones arbitrarias).

Un sistema que puede llevar a cabo transformaciones arbitrarias (o metaprogramas compuestos de conjuntos de ellas) en el código es DMS Software Reengineering Toolkit. DMS tiene interfaces para muchos lenguajes reales, construye estructuras de datos de compilador al analizar (incluidos los AST). DMS proporciona source-to-source program transformations que representan transformaciones como reescrituras AST utilizando la sintaxis de superficie del idioma de destino. Cumple con su requisito hasta cierto punto: si sus reglas de transformación son sintácticamente correctas (y DMS las verifica), el programa transformado será sintácticamente correcto. No logra su requisito de corrección de tipo, ya que los mecanismos de verificación de tipo se implementan fuera del idioma de destino. En principio, se podría usar un verificador de tipo seguro para aumentar las transformaciones del programa; en la práctica, descubrimos que podemos codificar transformaciones de manera confiable.

E incluso si tiene transformaciones de tipo seguro, no tiene una garantía de semántica de seguridad con respecto a su programa original. Por lo tanto, igual tendrá que depurar los metaprogramas.

+0

¿Cómo se compara eso con Stratego y TXL? –

+0

Similar, en que los tres tienen una sintaxis de superficie AST reescritura. DMS tiene una variedad de interfaces de lenguaje de calidad de producción. DMS proporciona control/flujo de datos/callgraph/pointsto y mecanismos de analsis de rango simbólico que Stratego y TXL no proporcionan. Sus defensores sugieren que puede calcular la parte del análisis (de flujo) a pedido codificando varias reglas de reescritura, pero ese no es un enfoque que considero práctico. Para obtener más comparaciones de DMS con una variedad de tecnologías de manipulación de programas, consulte http://www.semdesigns.com/products/DMS/DMSComparison.html –

1

tiempo de compilación metaprogramming en Scala.

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala.

Cuestiones relacionadas