Si je le fais, par exemple: Il échoue à cause de le solution habituelle est une macro qui enveloppe" réifier "l'appel avec ma propre chose, mais il est plus long et plus intrusif. Comment rendre mes macros plus fortes que les macros habituelles soient élargies en premier? p> Attendez quelque chose comme: p> réinférer code> voit (qqq) code> au lieu de ( tostring [this] "qqq") code>. p> (defmacro qqq [] '(toString [this] "Qqq"))
(expand-first #{qqq} (reify Object (qqq)))
3 Réponses :
La macro qui oblige les macros utilisateur à développer en premier (nécessite qui a des idées comment le rendre meilleur? P > p> clojure.walk code>):
Prewalk code> vs postwalk code>? Macroexpand-Tous Code> vs Just Macroexpand Code>?
Cela fonctionnera: J'ai trouvé un apply-macro . Je l'ai essayé, mais cela semble être brisé. La chose la plus importante que j'ai tirée de regarder Apply-macro code> était-ce que cela a résolu le problème à l'aide de eval code> comme je l'ai. P> p>
CompilerException Impossible de résoudre le symbole: Tostring dans ce contexte
Le code fixe est (eval `(reconfigoir l'objet ~ (macroexpand` (qqq)))) code> Tout ce "macroexpands" est dupliqué sur et plus si j'utilise souvent QQQ. Y a-t-il mieux correctement?
Oh je suis désolé. J'ai oublié de mentionner. QQQ code> doit être une fonction qui renvoie une liste plutôt qu'une macro.
Il y a une macro de lecteur pour évaluer les choses à la fois de lecture (avant l'expansion macro-expansion) ..
(defn qqq [] '(toString [this] "Qqq")) (reify Object #=(qqq))
Version la plus courte et aucune dépendance supplémentaire. À l'air cool. Quels pièges / quel # = code> est normalement utilisé pour /
À peu près sûr qu'il n'y a pas de tel mécanisme de clojure.
@Brian Cabier, mais je soupçonne
Développer-premier code> peut être implémenté à l'extérieur (puis inclus dans le clojure). Essayer de faire ça.