Iはlet
フォーム内で使用できるように、私は、レキシカルスコープから変数を捕捉するマクロを定義して使用することができる:Clojureマクロのレキシカルスコープでのキャプチャ方法は? Common Lispでは
CL-USER> (defmacro plus9() `(+ 9 woo))
PLUS9
CL-USER> (macroexpand '(plus9))
(+ 9 WOO)
T
CL-USER> (let ((woo 1)) (plus9))
10
しかし、私はClojureのに似たマクロを定義するとき、それはuser
名前空間にwoo
の定義を探しています:
user=> (defmacro plus9 [] `(+ 9 woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 user/woo)
user=> (let [woo 1] (plus9))
CompilerException java.lang.RuntimeException: No such var: user/woo
は、明らかに私は、スコープがClojureの中でどのように機能するかを誤解しています。 Clojureでこのマクロを達成する正しい方法は何ですか?
http://hubpages.com/technology/Unhygenic-anaphoric-Clojure-macros-for-fun-and-profit – coredump
構文のClojureで引用これらの名前がレキシカルスコープの名前と衝突するのを避けるように特別に設計されています。答えに描かれているように、あなたがやろうとしていることがあれば余分な仕事をしなければなりません。 – Alex