Как определить переменные в макросе, чтобы они были доступны для вызывающего макроса - PullRequest
4 голосов
/ 16 декабря 2010

Я хочу иметь макрос dbtest, который можно использовать следующим образом:

(dbtest
  (prn test-object1)
  (prn test-object2))

test-object1 и test-object2 должны быть переменными, которые определены dbtest (потому что они нужны мне каждый раз, когда я используюмакрос dbtest).«prn» - просто пример;Я хочу использовать произвольный код внутри макроса.

Я пробовал это:

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

, где insert-object - это функция, которая вставляет что-то в БД и возвращает соответствующую структуру данных.

Но это не работает: я получаю сообщение об ошибке «нет таких переменных»

1 Ответ

5 голосов
/ 16 декабря 2010

у меня работает:

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

Вы уверены, что проблема не в вызовах, связанных с SQL?

...