Una macro si espande una forma in un'altra forma, in modo da non posso avere un ritorno macro due completamente indipendenti f ORM. Tuttavia, puoi fare in modo che restituisca moduli composti come le dichiarazioni do
che fanno un sacco di cose.
(defmacro foo [n]
`(do [email protected](map #(list println %) n)))
Per il vostro esempio di cui sopra è possibile inserire la macro intorno alla forma che si desidera modificare:
(expand-mr
(do
(prn 1)
(mr 2 3)
(prn 4)))
macro sono progettati per essere al sicuro e come tali non possono modificare nulla al di fuori della propria scopo. Attualmente una macro ottiene un'espressione s e la trasforma in un'altra espressione s più utile o utile. Affinché una macro restituisca due espressioni s separate, dovrebbe modificare la sua espressione di inclusione. La sintassi dovrebbe essere radicalmente diversa e non sono chiaro come ciò avverrebbe con le espressioni s. La soluzione è espandere l'ambito della macro per includere tutto ciò che deve essere modificato.
fonte
2010-09-21 18:48:47
Grazie Arthur! Stavo già aspettando quella risposta, ma è bello esserne certi. – Stefan
Ma puoi davvero darmi un esempio di come una macro che restituisce due moduli indipendenti può causare un problema di sicurezza, ma è al sicuro altrimenti? Penso che lo scopo sia sempre lo stesso. – Stefan
Sto usando il termine "sicuro" scusatemi vagamente per quello. Modificherò per espandere su quello. –