destrucutred引数を使用するマクロを書くときに問題があります。次に例を示します。ここではマクロを使用して構造化されたargsを渡す
(defmacro defny
[n args & forms]
`(defn ~n ~args [email protected]))
(defmacro defnz
[n f args & forms]
`(defn ~n ~args
(do
(~f [email protected])
[email protected])))
(defny y
[{:keys [value] :as args}]
(println "Y ARGS" args)
(println "Y VALUE" value))
(defnz z y
[{:keys [value] :as args}]
(println "Z ARGS" args)
(println "Z VALUE" value))
、私は同じことをしている、二つのマクロ、単にDEFNして呼び出してdefny、およびdefnzを持っているが、さらにdefnzの引数に先立ち、関数本体に呼び出す別の関数を受け入れます。
Iは、z起動すると、私は両方の値と引数が同じプリントアウト見ることを期待し、その代わりに、私は得る:
(z {:value 1})
Y ARGS {:keys [1], :as {:value 1}}
Y VALUE nil
Z ARGS {:value 1}
Z VALUE 1
=> nil
これが起こっている理由私が見ることができ、破壊さ引数{:キー[1 ]:as {:value 1}}がyに渡されていますが、defnzマクロを修正して、構造化されたargsを適切に渡せるようにする方法がわかりません。
あなたが簡単にマクロ展開で間違いを見ることができます
は 'macroexpand'と' macroexpandは-1 'あなたのマクロが生産しているどのようなコードを参照することをお試しください。 –