1

次のようなマクロを定義したいとしましょう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'

4

1 に答える 1

1

あなたは実際にあなたが与えた最後の例を試しましたか?コンパイラのバインディング*ns*は、マクロ拡張と同様にコンパイル時に発生するため、実行時のバインディングは、の動作に影響を与えないはずですdefspecial

于 2012-11-06T06:16:49.033 に答える