2011-05-09 36 views

回答

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)) 
4

Macroexpand不能看到macrolet介绍的宏。它们只在编译时存在,而宏扩展(当你直接调用它时)在运行时运行。您的测试仅适用于您使用clojure.core所定义的when。但是,只要您不希望在运行时扩展,那么macrolet将解决您的问题。

+0

@Hamza如果你不介意取决于一些非核心库,你也可以使用我的'amalloy-utils' [package]的宏部分(https://github.com/amalloy/amalloy) -utils/blob/master/src/amalloy/utils/macro.clj#L18),其中包括'anon-macro'(允许'macrolet'而不命名它)和'macro-do'(用于重写你的“使用N次“名为'macrolet'变成”使用大量参数“,”anon-macro“形式)。 – amalloy 2011-05-10 05:10:03