9
votes

Clojure - Comment faire ma macro Développer avant la macros système?

Si je le fais, par exemple: xxx pré>

Il échoue à cause de réinférer code> voit (qqq) code> au lieu de ( tostring [this] "qqq") code>. p>

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>

(defmacro qqq [] '(toString [this] "Qqq"))
(expand-first #{qqq} (reify Object (qqq)))


2 commentaires

À 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 peut être implémenté à l'extérieur (puis inclus dans le clojure). Essayer de faire ça.


3 Réponses :


1
votes

La macro qui oblige les macros utilisateur à développer en premier (nécessite clojure.walk ): xxx

qui a des idées comment le rendre meilleur?


1 commentaires

Prewalk vs postwalk ? Macroexpand-Tous vs Just Macroexpand ?



0
votes

Cela fonctionnera: xxx

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 était-ce que cela a résolu le problème à l'aide de eval comme je l'ai.


3 commentaires

CompilerException Impossible de résoudre le symbole: Tostring dans ce contexte


Le code fixe est (eval `(reconfigoir l'objet ~ (macroexpand` (qqq)))) 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 doit être une fonction qui renvoie une liste plutôt qu'une macro.



9
votes

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


1 commentaires

Version la plus courte et aucune dépendance supplémentaire. À l'air cool. Quels pièges / quel # = est normalement utilisé pour /