2017-09-21 1 views
2

Je veux faire une citation syntaxique d'un argument passé à une macro, mais je n'arrive pas à la contourner. Donc, étant donné une macro quote-it et <, je voudrais obtenirSyntaxe-citation d'un argument de macro?

(quote-it <) 
=> clojure.core/< 

Ni les œuvres de ce qui suit:

(defmacro quote-it [a] `~a) 
=> #'user/quote-it 
(quote-it <) 
=> #object[clojure.core$_LT_ 0x11c08900 "[email protected]"] 

(defmacro quote-it [a] `'~a) 
=> #'user/quote-it 
(quote-it <) 
=> < 

Répondre

2

Vous pouvez résoudre le symbole à un var dans l'espace de noms en cours en utilisant le clojure.core/resolve fonction. L'objet var contient l'espace de nom et le nom du symbole d'origine. Vous pouvez ensuite construire un nouveau symbole en utilisant ces valeurs et le renvoyer.

(defmacro quote-it [a] 
    (let [r (resolve a)] 
    `'~(symbol (str (:ns (meta r))) (str (:name (meta r))))))