有没有办法扩展宏而不实际定义它?我的情况是我有一堆宏可能/可能不会覆盖clojure宏,我需要将这些宏应用于s表达式列表?
答案 0 :(得分:4)
Macroexpand无法看到macrolet引入的宏。它们仅在编译时存在,而macroexpand(当您直接调用它时)在运行时运行。您的测试仅有效,因为您以与clojure.core相同的方式定义when
。但是,只要您不想在运行时扩展,macrolet就能解决您的问题。
答案 1 :(得分:2)
通过contrib挖掘,找到了我想要的东西,
(use ' clojure.contrib.macro-utils)
(macrolet [(when [test & body]
(list 'if test (cons 'do body)))]
(macroexpand '(when true 4)))
(if true (do 4))