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?
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) –
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