你能强制一个Clojure宏来评估它的论点吗?

时间:2012-12-21 18:28:54

标签: macros clojure

我正在尝试定义一个包装clojure.test/deftest的辅助函数。这是我的总体想法:

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

但是,由于deftest的第一个参数未被评估,因此它会抛出异常,因为它是表单而不是符号。有没有办法强制表格先评估?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

这里更好的方法是使测试包装器成为一个宏。宏不会评估他们的论点,除非你告诉他们。您可以操作参数并在一些生成的代码中替换它们,如下所示:

(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)