何が私たちに与えられるか見てみましょうmacroexpand-1
:
user=> (clojure.pprint/pprint (macroexpand-1 '(def-middleware plus-two [x] (+ 2 x))))
(defn
~fn-name
[f]
$
(fn ~args$ (f (clojure.core/unquote-splicing body))))
正確には私たちが求めているものではありません!まず最初に:マクロ内の引用符を解除する場合は、「'」ではなく「 `」(準引用符/構文引用符の演算子)を使用する必要があります。また、これらのドル記号で何を求めているのかはわかりませんが、gensym
衛生に使用するためのclojureの便利なショートカットを使用している可能性があります。ただし、使用する各識別子の直後に必要であり(つまり[f#]
、ではなく[f]$
)、識別子が出現するたびに必要になります。そして、あなたはそれを必要としませんargs
。これらすべてをまとめると:
user=> (defmacro def-middleware [fn-name args & body] `(defn ~fn-name [f#] (fn ~args (f# ~@body))))
#'user/def-middleware
user=> (clojure.pprint/pprint (macroexpand-1 '(def-middleware plus-two [x] (+ 2 x))))
(clojure.core/defn
plus-two
[f__594__auto__]
(clojure.core/fn [x] (f__594__auto__ (+ 2 x))))
nil
user=>