2012-07-03 4 views
5

Ho testato alcune invocazioni macro nidificate, e hanno lavorato come previsto, per esempio, supponendo un fittizio aggiungere macro e la seguente espressione (... come ci si aspetta da me!):È sicuro annidare le invocazioni di macro?

add(1, add(2, 3)) 

In primo luogo il l'addizione interna è espansa (2 + 3) e in secondo luogo l'esterno fa la sua parte (1 + (2 + 3)). Ho visto che la macro esterna non riceve alcun rumore dall'invocazione interna - nell'espressione di input - quindi l'espansione interna sembra totalmente trasparente ad essa. Questo fatto è sempre valido (anche con macro e tipi più complessi)? È sicuro farlo?

+1

Non sono riuscito a ottenere abbastanza informazioni da skimming per rispondere in modo adeguato alla domanda, ma potresti essere interessato a questo documento che descrive il sistema macro Racket: [Macro che funzionano insieme: binding in fase di compilazione, espansione parziale e definizione] (http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf) –

+0

Non conosco bene quel documento specifico, ho letto solo la versione della conferenza, ma il sistema macro di Scala è non del tutto paragonabile, ad esempio, typechecking si verifica prima dell'espansione della macro, anche se è necessario eseguire la risoluzione dei nomi e consentire l'* aggiunta * dell'igiene usando reify. Non avere paura: le macro di Scala non sono igieniche di default, ma le singole macro sono se costruisci solo AST per ritornare tramite reify (che è in qualche modo simile alla quasi-citazione, non ho ancora ottenuto la differenza francamente). – Blaisorblade

risposta

8

Le macro interne vengono sempre espanse per prime (anche se vengono fornite come argomenti nome-per-nome).

+0

Penso che l'altra parte della risposta sia (si spera) che dopo aver espanso la macro interna, il risultato sia digitato prima di richiamare la macro esterna (altrimenti, l'output potrebbe non essere completamente scritto/risolto). – Blaisorblade

+1

In effetti, l'espansione dei macro interni viene tipografata prima di essere passata alla macro esterna. Le espansioni di macro vengono sempre digitate correttamente dopo essere state restituite dalle implementazioni di macro. –