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