2011-05-09 32 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