Macros 可以强制Clojure宏计算其参数吗?

Macros 可以强制Clojure宏计算其参数吗?,macros,clojure,Macros,Clojure,我试图定义一个helper函数来包装clojure.test/deftest。以下是我的总体想法: (defn test-wrapper [name & body] (deftest (symbol (clojure.string/replace name #"\W" "-")) body))) 但是,由于deftest的第一个参数未计算,因此它会引发异常,因为它是一个表单而不是一个符号。有没有办法强制窗体先求值?没有办法让宏(您没有编写)求值它的参数 让您的测试包装器实现您所

我试图定义一个helper函数来包装
clojure.test/deftest
。以下是我的总体想法:

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

但是,由于
deftest
的第一个参数未计算,因此它会引发异常,因为它是一个表单而不是一个符号。有没有办法强制窗体先求值?

没有办法让宏(您没有编写)求值它的参数


让您的
测试包装器
实现您所希望的功能的最佳方法是将其本身转换为宏。然后它可以计算对
symbol
本身的调用,然后扩展到对
deftest
的调用,调用
symbol
的结果作为第一个参数。

这里更好的方法是将测试包装器设置为宏。宏不会计算它们的参数,除非您告诉它们。您可以操作参数并在某些生成的代码中替换它们,如下所示:

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