Макрос для тестов обтекания с перекадром run-test-syn c не работает - PullRequest
1 голос
/ 28 апреля 2020

В моем коде есть следующая идиома:

(deftest my-test
   (run-test-sync
       (is (= 1 2)) ;; etc.
   )

И кажется хорошей идеей создать макрос, который бы повторял это так:

(deftest-sync my-test
   (is (= 1 2))
)

И я пробовал это:

(defmacro deftest-sync [name test]
  `(deftest ~name ~(run-test-sync ~test))
  )

Но при выполнении:

(macroexpand '(deftest-sync some-test (is (= 1 1))))

Я просто получаю результат:

(deftest-sync some-test (is (= 1 1)))

Что я делаю не так?

- РЕДАКТИРОВАТЬ - Моя вторая попытка заключается в следующем:

(defmacro deftest-sync [name & test]
  `(deftest ~name (run-test-sync ~@test))
  )

Но расширение макроса все равно:

(deftest-sync some-test (is (= 1 1)))

Что я делаю не так?

1 Ответ

0 голосов
/ 29 апреля 2020

Я думаю, что ваша вторая версия в порядке. Я проверил это на REPL Clojure (JVM) с CIDER:

(ns macrodemo.core)

(defmacro deftest-sync [name & test]
  `(deftest ~name (run-test-sync ~@test)))

;; (macroexpand '(deftest-sync some-test (is (= 1 1))))
;; => (macrodemo.core/deftest some-test (macrodemo.core/run-test-sync (is (= 1 1))))
;;
;; ... which is basically:
;; (deftest some-test (run-test-sync (is (= 1 1))))
...