2010-10-30 19 views
3

Je ne sais pas comment exprimer cela ..Les macros Clojure et la liaison de symboles

J'ai écrit une macro qui prend deux arguments. Le premier contient essentiellement des identifiants pour générer une expression let. Le second est le code à utiliser dans l'expression let (il veut avoir accès à ces identifiants).

Un exemple:

(match (Add {ast-> x}) (println x)) 

Lorsque le deuxième argument est le code brut, les choses fonctionnent bien. x se lie au x défini dans l'expression let (quand macroexpanded il montre juste comme x). Cependant, lorsque le second argument est une macro qui génère (println x), x s'étend à quelque chose comme user/x.

Des bonnes idées pour y remédier?

Répondre

6

Il semble que votre deuxième macro est définie comme:

(defmacro foo 
    [] 
    `(println x)) 

Ceci est incorrect que x sera namespace qualifié. La version correcte de la deuxième macro dans ce cas serait:

(defmacro foo 
    [] 
    `(println ~'x)) 

Maintenant, le x dans le println appel sera un symbole littéral x et non l'espace de noms qualifié.

+0

Ah, exactement ce que je voulais, merci! –