Clojure China

关于宏展开的问题

#1
(defmacro try-catch-return-default-value [doing exception val] 
 `(try (~doing) (catch ~exception e ~val)))

当我尝试展开的时候

(macroexpand '(try-catch-return-default-value (+ 1 1) Exception -1))

结果变成了这样子

(try ((+ 1 1)) (catch Exception user/e -1))  ;;这个e变成user/e  

请问下正确的写法是怎么样的,有没有专门介绍clojure 宏的好文章可以推荐下的。

#2

将 e 改成 e# 或者 ~'e 就可以。

资料的话,读 《mastering clojure macros》这本书吧,深入浅出。

#3

很感谢~ 原理能简单介绍下么

#4

这里有个专业术语 Macro Hygiene ,主要是保证宏展开的代码不会对原有代码造成污染。可以看看我的这个文章: