将宏应用于表单而不定义宏

时间:2011-05-09 00:07:34

标签: clojure lisp

有没有办法扩展宏而不实际定义它?我的情况是我有一堆宏可能/可能不会覆盖clojure宏,我需要将这些宏应用于s表达式列表?

2 个答案:

答案 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))