clojuredefmacroに自分のやりたいことをさせるのに苦労しています。実際のコードを次のスニペットに減らしました。
これは私が欲しいものに近い何かを作成します。マクロに渡されたパラメーターに応じて、(最初のp#)または(2番目のp#)のいずれかを条件付きで挿入しようとしています。
(defmacro mmz1 [t]
`(map (fn [p#] (let [t1# (first p#)
t2# ~(if t `(first p#) `(second p#))]
(* t1# t2#)))
[ [1 2] [3 4] ]))
(macroexpand-1 '(mmz1 false))
ショー
(map
(fn [p__18341__auto__]
(let [t1__18342__auto__ (first p__18341__auto__)
t2__18343__auto__ (second p__18340__auto__)]
(* t1__18342__auto__ t2__18343__auto__)))
[[1 2] [3 4]])
ただし、この形式の変数(2番目のp_ 18340 _auto_)は無名関数の引数p _18341_auto_と一致しないことに注意してください。したがって、その2番目の変数が定義されていないため、コードを実行するとエラーが発生します。これらの変数を一致させるにはどうすればよいですか?これが私が成し遂げたいことです。
テストの目的で、このコードは私が望むことを達成しますが、t2#を設定する結果のマクロコードに(if)形式は必要ありません。マクロは私がこれを行うことを可能にするはずです-そうではありませんか?
(defmacro mmz0 [t]
`(map (fn [p#] (let [t1# (first p#)
t2# (if ~t (first p#) (second p#))]
(* t1# t2#)))
[ [1 2] [3 4] ]))
(macroexpand-1 '(mmz0 false))
ショー
(map
(fn [p__18387__auto__]
(let [t1__18388__auto__ (first p__18387__auto__)
t2__18389__auto__ (if false
(first p__18387__auto__)
(second p__18387__auto__))]
(* t1__18388__auto__ t2__18389__auto__)))
[[1 2] [3 4]])
コードの出力は期待どおりです。
(mmz0 false) -> (2 12)