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