2012-07-03 9 views
5

he estado probando algunas invocaciones de macros anidadas, y funcionaron como se esperaba Por ejemplo, suponiendo un ficticio añadir macro y la siguiente expresión (... como se esperaba por mí!):¿Es seguro anidar macro invocaciones?

add(1, add(2, 3)) 

En primer lugar el inner add se expande (2 + 3) y en segundo lugar el outter one hace su parte (1 + (2 + 3)). He visto que la macro outter no recibe ningún ruido de la invocación interna, en la expresión de entrada, por lo que la expansión interna parece totalmente transparente. ¿Este hecho siempre se cumple (incluso con macros y tipos más complejos)? ¿Es seguro hacerlo?

+1

No pude obtener suficiente información de skimming para responder adecuadamente a su pregunta, pero puede interesarle este artículo que describe el sistema macro Racket: [Macros que funcionan juntos: enlaces de tiempo de compilación, expansión parcial y contextos de definición] (http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf) –

+0

No conozco bien ese documento específico, solo he leído la versión de la conferencia, pero el sistema macro de Scala es no completamente comparable, digamos que la verificación de tipo ocurre antes de la expansión de macros, aunque se requiere para hacer una resolución de nombre y permitir que se agregue * higiene * usando reify. No tengas miedo: las macros de Scala no son higiénicas por defecto, pero las macros individuales son si solo creas AST para regresar a través de reify (que es algo similar a cuasi-quotation, todavía no entiendo la diferencia francamente). – Blaisorblade

Respuesta

8

Las macros más internas siempre se expanden primero (incluso si se proporcionan como argumentos por nombre).

+0

Creo que la otra parte de la respuesta es (con suerte) que después de expandir la macro interna, el resultado se comprueba con el tipo antes de invocar la macro externa (de lo contrario, la salida podría no estar completamente tipeada/resuelta). – Blaisorblade

+1

De hecho, la expansión de las macros internas se comprueba con tipos antes de pasar a la macro externa. Las expansiones de macro siempre se comprueban por tipo inmediatamente después de que se devuelven desde implementaciones de macros. –