clojure中带有宏的变量捕获

clojure中带有宏的变量捕获,clojure,lisp,Clojure,Lisp,我试图使用这种技术将值绑定到宏中传入的符号 (defmacro t2macro[所有绑定体](reduce(fn[acc[v绑定]) `(让[~v~绑定]~acc)) `(do~@body)所有绑定) #'plans-client.mock/t2macro plans client.mock>(t2macro[[A1][B2]](打印(+AB))) 3. 这个简化版本很好用。现在,当我尝试在宏列表的上下文中使用相同的技术时 (defmacro with-mocked-grpc [mocke

我试图使用这种技术将值绑定到宏中传入的符号

(defmacro t2macro[所有绑定体](reduce(fn[acc[v绑定])
`(让[~v~绑定]~acc))
`(do~@body)所有绑定)
#'plans-client.mock/t2macro
plans client.mock>(t2macro[[A1][B2]](打印(+AB)))
3.
这个简化版本很好用。现在,当我尝试在宏列表的上下文中使用相同的技术时

(defmacro with-mocked-grpc
  [mocked-responses & body]
  (let [mocks (for [[mock-name [status response]] (partition-all 2 mocked-responses)]
                (let [conformed-resp
                      (specs-util/conform-or-throw ::response response)
                      generated-resp (check-response conformed-resp mock-name)
                      bindings       (check-bindings generated-resp)]
                  (with-meta [mock-name [status generated-resp]]
                    (when bindings {:bindings bindings}))))
        all-bindings (map (fn [m] (:bindings (meta m))) mocks)]
    (reduce (fn [acc [v binding]]
              `(let [~v ~binding] ~acc))
            `(do ~@body) all-bindings)))
我这样称呼它

(with-mocked-grpc [plans/usage-summary [:ok ^{:sized 100 :binding a} _]] 1)
我得到这个例外

CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(*cider-repl plans-service/client:localhost:45691(clj)*:204:20)
check response为该宏的使用者生成一个生成的值,以便在测试中使用。check binding查找用户要求绑定到变量的生成值

macroexpand
返回

(let [a {:generated :value}] 1) 

在宏扩展之后,元数据仍然会得到解析,因此将let行更改为

(let [~(with-meta v nil) ~(with-meta binding nil)] ~acc)
修好了