2

这是代码的传递版本

正常功能:通过

(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的代码相同。

我不明白为什么这不起作用?

4

1 回答 1

4

问题是你的宏是错误的。当您的函数在运行时抛出错误时,宏会在编译时抛出它。以下应该解决该行为:

(defmacro my-fn
  []
  `(throw (IllegalStateException.)))

现在您的宏调用将被抛出的异常替换。像这样的东西:

(fact
  (throw (IllegalStateException.)) => (throws IllegalStateException))
于 2016-11-17T21:34:28.083 回答