次のようなマクロを定義したいとしましょうdefsomething
:
(defspecial a x)
…これに展開します:
(def a (f `a x))
その構文引用符`a
にはトリッキーな部分があります。現在の名前空間をシンボルに適切にアタッチして、構文引用符のように動作させる方法がわかりません。例えば:
(defmacro defspecial [var-symbol expr]
`(def ~var-symbol (f '~var-symbol ~expr)))
(defspecial a x)
…次のように展開します。
(def a (f 'a x))
…これは近いですが、その 2 番目a
は名前空間で修飾されていません。
私は使用できることを知っています*ns*
:
(defmacro defspecial [var-symbol expr]
`(def ~var-symbol (f (symbol (name (ns-name *ns*)) (name '~var-symbol)) ~expr)))
…でも、私はそれが好きではありません。醜いだけでなく、*ns*
再バインド可能であるため、これは可能です:
(binding [*ns* (the-ns 'clojure.core)]
(defspecial a 5))
残念ながら、Clojure には のようなフォームはないsyntax-quote
ようです。では、このマクロをどのように実装すればよいのでしょうか?`
quote
'