2012-12-04 12 views
5

Iちょうど特にマクロとClojureのマクロを学習し、私は好奇心が強いことは、このような何かをすることが可能です:のClojure VARを定義するマクロ

(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な方法がありますか?

答えて

8

デフォルトでは、構文引用形式は、で、名前空間のないシンボルとシンボルのキャプチャをマクロに導入することを防ぎます。意図的にこれを行うときは、シーケンス~'を使用して、マクロに修飾されていないシンボルを導入することができます。これは空想名前照応マクロを持っています

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

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

マクロは

+4

それは '〜 ''いずれかの特定の特別なシーケンスではないことに注意することは便利ですが、 '〜'(残し構文引用符だけの組み合わせ)と '' '(通常の引用符で始まります)。 – amalloy

+0

良い点、ありがとう:) –