让我们看看是什么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))))
不正是我们所追求的!首先要做的事情:如果你想在宏中取消引用,你需要使用“`”(准引号/语法引号运算符),而不是“'”。另外,我不确定您对这些美元符号的用途是什么,但可能是您正在使用 clojuregensym
用于卫生的便捷快捷方式。但是在使用它的每个标识符(so [f#]
,not [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=>