我试图定义一个包装clojure.test/deftest
的帮助函数。这里是我的总体思路:你可以强制Clojure宏来评估它的参数吗?
(defn test-wrapper
[name & body]
(deftest (symbol (clojure.string/replace name #"\W" "-")) body)))
然而,由于第一个参数是deftest
不计算,它抛出一个异常,因为它是一种形式,而不是一个符号。有没有办法强制表单首先评估?
我试图定义一个包装clojure.test/deftest
的帮助函数。这里是我的总体思路:你可以强制Clojure宏来评估它的参数吗?
(defn test-wrapper
[name & body]
(deftest (symbol (clojure.string/replace name #"\W" "-")) body)))
然而,由于第一个参数是deftest
不计算,它抛出一个异常,因为它是一种形式,而不是一个符号。有没有办法强制表单首先评估?
这里更好的方法是使测试包装器成为一个宏。除非你告诉他们,否则宏不会评估他们的论点。您可以操作参数并将其替换为一些生成的代码,如下所示:
(use 'clojure.test)
(defmacro test-wrapper
[name & body]
(let [test-name (symbol (clojure.string/replace name #"\W" "-"))]
`(deftest ~test-name [email protected])))
(test-wrapper "foo bar" (is (= 1 1)))
(run-tests)
没有办法让一个宏(你没有写)评估它的参数。
最好的方法使你的test-wrapper
做你想做的事情,将它变成一个宏本身。然后,它可以评估对symbol
本身的呼叫,然后扩展到对deftest
的呼叫,并将呼叫的结果作为第一个参数作为symbol
。
完美,谢谢! – mybuddymichael