4

我正在尝试定义一个包装clojure.test/deftest. 这是我的一般想法:

(defn test-wrapper
  [name & body]
  (deftest (symbol (clojure.string/replace name #"\W" "-")) body)))

但是,由于第一个参数deftest未计算,它会引发异常,因为它是一种形式而不是符号。有什么办法可以强制表格先评估?

4

2 回答 2

4

没有办法让宏(不是你写的)评估它的参数。

让你test-wrapper做你想做的事的最好方法是将它变成一个宏本身。然后它可以评估对symbol自身的调用,然后以调用deftest结果symbol作为第一个参数扩展为调用。

于 2012-12-21T18:48:01.103 回答
4

这里更好的方法是让 test-wrapper 成为一个宏。除非您告诉他们,否则宏不会评估他们的论点。您可以操作参数并将它们替换为一些生成的代码,如下所示:

(use 'clojure.test)

(defmacro test-wrapper
  [name & body]
  (let [test-name (symbol (clojure.string/replace name #"\W" "-"))]
    `(deftest ~test-name ~@body)))

(test-wrapper "foo bar" (is (= 1 1)))

(run-tests)
于 2012-12-21T18:59:23.477 回答