Macros Clojure-如何使我的宏在系统宏之前展开?
如果我这样做,例如:Macros Clojure-如何使我的宏在系统宏之前展开?,macros,clojure,Macros,Clojure,如果我这样做,例如: (defmacro qqq [] '(toString [this] "Qqq")) (reify Object (qqq)) 它失败是因为reify看到的是(qqq),而不是(toString[this]“qqq”) 是一个用我自己的东西包装“具体化”调用的宏,但它更长、更具侵入性 如何使我的宏比通常先展开的宏更强大 期待类似于: (defmacro ^{:priority 100500} qqq [] '(toString [this] "Qqq")) (reify
(defmacro qqq [] '(toString [this] "Qqq"))
(reify Object (qqq))
它失败是因为reify
看到的是(qqq)
,而不是(toString[this]“qqq”)
是一个用我自己的东西包装“具体化”调用的宏,但它更长、更具侵入性
如何使我的宏比通常先展开的宏更强大
期待类似于:
(defmacro ^{:priority 100500} qqq [] '(toString [this] "Qqq"))
(reify Object (qqq))
或
强制给定用户宏首先展开的宏(需要
clojure.walk
):
谁有办法让它变得更好?这将起作用:
(defn reifyx [x y]
(eval `(reify ~x ~y)))
(defn qqq [] '(toString [this] "Qqq"))
(reifyx 'Object (qqq))
我找到了一个。我试过了,但好像坏了。通过查看
apply macro
我收集到的最重要的信息是,它使用eval
解决了问题,正如我所做的一样。有一个读卡器宏,用于在读取时(在宏扩展之前)评估内容
我从来没有在“真正的”代码中看到过这样的事情,我认为大多数人都认为它是一个黑客,但如果你需要的话,它就在那里。< / P>很确定在Culjure中没有这样的机制。@ Brian Carper,但是我怀疑<代码>扩展<可以在外部实现(并且后来被包含在Culjure中)。试着这么做。
prewalk
vspostwark
macroexpand all
vs justmacroexpand
?编译器异常无法解析符号:此上下文中的toString固定代码为(eval`(具体化对象~(macroexpand`(qqq)))
如果我经常使用qqq,所有这些“macroexpands”都会重复。有更好的办法吗?哦,对不起。我忘了提qqq
应该是一个返回列表而不是宏的函数。最短版本且没有其他依赖项。看起来不错。什么陷阱/什么#=
通常用于/
(defmacro expand-first [the-set & code]
`(do ~@(prewalk
#(if (and (list? %) (contains? the-set (first %)))
(macroexpand-all %)
%) code)))
(defn reifyx [x y]
(eval `(reify ~x ~y)))
(defn qqq [] '(toString [this] "Qqq"))
(reifyx 'Object (qqq))
(defn qqq [] '(toString [this] "Qqq"))
(reify Object #=(qqq))