【发布时间】:2017-12-14 21:37:41
【问题描述】:
我正在尝试定义一个宏,该宏编写代码来为传入的表达式执行 try catch 块。
(defmacro safe
[expression]
`(try
~expression
(catch Exception e (str "caught exception: " (.getMessage e)))
)
)
宏写得很好,但是当我对其进行一些测试时,我收到以下编译器错误
seminar.core=> (def v (safe (/ 1 0)))
CompilerException java.lang.RuntimeException: Can't bind qualified name:seminar.core/e, compiling:(/private/var/folders/6f/q7lhngtn45q_xpzd_24gjp2h0000gn/T/form-init2350735096437822603.clj:1:8)
seminar.core=> (def v (safe (/ 10 2)))
CompilerException java.lang.RuntimeException: Can't bind qualified name:seminar.core/e, compiling:(/private/var/folders/6f/q7lhngtn45q_xpzd_24gjp2h0000gn/T/form-init2350735096437822603.clj:1:8)
这就是宏的行为方式
user> (def v (safe (/ 1 0)))
user> v
#<ArithmeticException java.lang.ArithmeticException: Divide by zero>
user> (def v (safe (/ 10 2)))
user> v
5
【问题讨论】: