Midje 在 Clojure 中使用宏失败
Midje fails on Macros in Clojure
这是代码的通过版本:
正常功能:通过
(defn my-fn
[]
(throw (IllegalStateException.)))
(fact
(my-fn) => (throws IllegalStateException))
这是它的宏版本:
(defmacro my-fn
[]
(throw (IllegalStateException.)))
(fact
(my-fn) => (throws IllegalStateException))
失败 这里是输出:
LOAD FAILURE for example.dsl.is-test
java.lang.IllegalStateException, compiling:(example/dsl/is_test.clj:14:3)
The exception has been stored in #'*me, so `(pst *me)` will show the stack trace.
FAILURE: 1 check failed. (But 12 succeeded.)
这是相同的代码,我只是将 defn 更改为 defmacro。
我不明白为什么这不起作用?
问题是您的宏有误。当您的函数在运行时抛出错误时,宏会在编译时抛出错误。以下内容应修复该行为:
(defmacro my-fn
[]
`(throw (IllegalStateException.)))
现在您的宏调用将被抛出的异常所取代。类似的东西:
(fact
(throw (IllegalStateException.)) => (throws IllegalStateException))
这是代码的通过版本:
正常功能:通过
(defn my-fn
[]
(throw (IllegalStateException.)))
(fact
(my-fn) => (throws IllegalStateException))
这是它的宏版本:
(defmacro my-fn
[]
(throw (IllegalStateException.)))
(fact
(my-fn) => (throws IllegalStateException))
失败 这里是输出:
LOAD FAILURE for example.dsl.is-test
java.lang.IllegalStateException, compiling:(example/dsl/is_test.clj:14:3)
The exception has been stored in #'*me, so `(pst *me)` will show the stack trace.
FAILURE: 1 check failed. (But 12 succeeded.)
这是相同的代码,我只是将 defn 更改为 defmacro。
我不明白为什么这不起作用?
问题是您的宏有误。当您的函数在运行时抛出错误时,宏会在编译时抛出错误。以下内容应修复该行为:
(defmacro my-fn
[]
`(throw (IllegalStateException.)))
现在您的宏调用将被抛出的异常所取代。类似的东西:
(fact
(throw (IllegalStateException.)) => (throws IllegalStateException))