中置演算子の使用を許可する次のマクロ ( clojure-koansから) があります。
(defmacro infix-better [form]
`(~(second form)
(first form)
(last form) ))
想定どおりの動作をしますが、正確に同じ式に展開するわけではありません。例えば:
user=> (= '(* 10 2) (macroexpand '(infix-better (10 * 2))))
false
user=> '(* 10 2)
(* 10 2)
user=> (macroexpand '(infix-better (10 * 2)))
(* (clojure.core/first user/form) (clojure.core/last user/form))
最後の出力は(* 10 2)
、内部式が評価されたときになりますが(clojure.core/first user/form)
、厳密に言えば、そうではないため、等価テストは false を返します10
。
展開されたマクロを同等のハードコードされた Clojure と等しくするにはどうすればよいですか?