4
有没有扩展宏而不实际定义它的方法?我的情况是,我有一堆宏可能/可能不会覆盖clojure宏,我需要将这些宏应用于s表达式列表?在不定义宏的情况下将宏应用于表单
有没有扩展宏而不实际定义它的方法?我的情况是,我有一堆宏可能/可能不会覆盖clojure宏,我需要将这些宏应用于s表达式列表?在不定义宏的情况下将宏应用于表单
通过了contrib挖掘,找到了我一直在寻找,
(use ' clojure.contrib.macro-utils)
(macrolet [(when [test & body]
(list 'if test (cons 'do body)))]
(macroexpand '(when true 4)))
(if true (do 4))
Macroexpand不能看到macrolet介绍的宏。它们只在编译时存在,而宏扩展(当你直接调用它时)在运行时运行。您的测试仅适用于您使用clojure.core所定义的when
。但是,只要您不希望在运行时扩展,那么macrolet将解决您的问题。
@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