Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros Clojure-如何使我的宏在系统宏之前展开?_Macros_Clojure - Fatal编程技术网

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
vs
postwark
macroexpand all
vs just
macroexpand
?编译器异常无法解析符号:此上下文中的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))