如何在宏中定义变量,以便它们可用于宏的调用者

qol*_*lin 4 macros clojure

我想要一个可以像这样使用的宏dbtest:

(dbtest
  (prn test-object1)
  (prn test-object2))
Run Code Online (Sandbox Code Playgroud)

test-object1和test-object2应该是dbtest定义的变量(因为我每次使用dbtest宏都需要它们)."prn"只是一个例子; 我想在宏中使用任意代码.

我试过这个:

(defmacro dbtest [& body]
  `(sql/with-connection db
     (delete-all-tables)
     (let [~'test-object1 (insert-object "foo")]
       ~@body)))
Run Code Online (Sandbox Code Playgroud)

其中insert-object是一个向DB中插入内容并返回相应数据结构的函数.

但它不起作用:我得到一个"没有这样的var"错误

Mat*_*ard 5

这个对我有用:

user=> (defmacro let-test [& body]
         `(let [~'test-object1 123] ~@body))
#'user/let-test
user=> (let-test (+ test-object1 321))
444
Run Code Online (Sandbox Code Playgroud)

您确定问题与SQL相关的调用无关吗?