5

私はマクロと clojure マクロを特に学習しているだけで、次のようなことが可能かどうか興味があります。

(defmacro with-a=hello [f]
  `(let [a "hello"] ~f))

(with-a=hello (println a))

これは私にはうまくいかず、エラーがスローされます:CompilerException java.lang.RuntimeException: Can't let qualified name: user/a, compiling:(NO_SOURCE_PATH:1)

私が今のところ理解していないので、スキームdefine-syntaxはこのようなことを可能にしますが、これのためのclojureの方法はありますか?

4

1 に答える 1

10

デフォルトでは、syntax-quote 形式`により、名前空間のないシンボルの導入とマクロでのシンボルのキャプチャが防止されます。意図的にこれを行うと、シーケンス~'を使用して非修飾シンボルをマクロに導入できます。

 (defmacro with-a=hello [f]
    `(let [~'a "hello"] ~f))

user> (with-a=hello (println a))
hello
nil

これを行うマクロには、アナフォリック マクロという派手な名前が付いています。

于 2012-12-04T17:41:16.033 に答える