2010-04-28 7 views
0

Soyez gentil, car mon macrofoo est faible.Accéder à un local d'une macro dans une autre exécutée dans le cadre du let

Ce que je voudrais faire est quelque chose comme ceci:

(defmacro foo [x] `(dosync (alter x# conj x))) 
(defmacro bar [] `(let [x# (ref [])] (foo 3))) 

Est-ce possible? Je ne peux pas juste (let [x ..] ..) en raison de la capture de symboles. REMARQUE: Je suis conscient que cet exemple est trivial et non macro-digne, mais c'est l'exemple le plus simple que je pourrais trouver.

+0

Une chance que vous pourriez fournir un exemple moins simple, mais plus réaliste? Je trouve vraiment difficile de dire ce que vous essayez de faire (même si vous avez votre propre réponse!). Je demande juste de comprendre ce qui se passe, pas d'inquiétude si vous préférez passer à autre chose. :-) –

+0

http://gist.github.com/381870 Est un meilleur exemple de ce que j'essayais de faire. Cela ne fonctionne toujours pas à cause d'une raison sans rapport. – Rayne

Répondre

1

Je devais forcer la capture de symboles.

(defmacro foo [x] `(dosync (alter ~'x conj x))) 
(defmacro bar [] `(let [~'x (ref [])] (foo 3))) 

Bien que dangereux si vous ne comprenez pas les macros à fond, cela fonctionne.

+0

Je pense qu'il vous manque syntax-citation dans les deux. (Voir aussi mon commentaire sur la question.) –

+0

Oui, j'ai oublié d'ajouter cela. Pardon. – Rayne