(謝罪これは別の質問の重複している場合、それらすべての空想の特殊文字のための私の検索では何も得られませんでした。)なぜこのクロージャーマクロは `〜〜を必要としますか?
私はMastering Clojure Macrosを読んでいると、次の例を理解悩みを持っている:
を(defmacro inspect-caller-locals []
(->> (keys &env)
(map (fn [k] [`'~k k]))
(into {})))
=> #'user/inspect-caller-locals
(let [foo "bar" baz "quux"]
(inspect-caller-locals))
=> {foo "bar", baz "quux"}
以下との違いは何ですか?'k
?
`'~k
私の知る限り理解し、最も内側にunquote ~
は、単に最も外側の構文引用符 `の効果を元に戻し必要がありますが、短い実験はそれによりがあることを明らかに:、残念ながら
(defmacro inspect-caller-locals-simple []
(->> (keys &env)
(map (fn [k] ['k k]))
(into {})))
=> #'user/inspect-caller-locals-simple
(let [foo "bar" baz "quux"]
(inspect-caller-locals-simple))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: k in this context, compiling:(/tmp/form-init4400591386630133028.clj:2:3)
私の通常の調査アプローチはここには適用されません:
(macroexpand '(let [foo "bar" baz "quux"]
(inspect-caller-locals)))
=> (let* [foo "bar" baz "quux"] (inspect-caller-locals))
(let [foo "bar" baz "quux"]
(macroexpand '(inspect-caller-locals)))
=> {}
私はここで何が欠けていますか?
macroexpandの代わりに、あなたが気にするマクロの部分を評価してください。 : '(let [k 'foo] [k' k \' '〜k]) ' – amalloy