macros - Clojure - 如何让我的宏在系统宏之前展开?

标签 macros clojure

如果我这样做,例如:

(defmacro qqq [] '(toString [this] "Qqq"))
(reify Object (qqq))

它失败是因为 reify(qqq)而不是 (toString [this] "Qqq") .

usual solution是一个用我自己的东西包装“reify”调用的宏,但它更长,更具侵入性。

如何使我的宏比通常要首先扩展的宏更强大?

期待类似的东西:
(defmacro ^{:priority 100500} qqq [] '(toString [this] "Qqq"))
(reify Object (qqq))

或者
(defmacro qqq [] '(toString [this] "Qqq"))
(expand-first #{qqq} (reify Object (qqq)))

最佳答案

有一个读取器宏可以在读取时(在宏扩展时间之前)评估事物。

(defn qqq [] '(toString [this] "Qqq"))
(reify Object #=(qqq))

我从未在“真实”代码中看到过这种情况,我认为大多数人会认为这是一种黑客行为,但如果您需要它,它就在那里。

关于macros - Clojure - 如何让我的宏在系统宏之前展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984504/

相关文章:

c - 在 C 的宏中使用宏的名称

function - Clojure 星号特殊形式(fn*、let* 等...)

syntax - 可以使用 Clojure/Lisp 宏来实现此 lambda 语法吗?

rust - prelude 中是否包含了 Rust std 库中的所有宏?

Clojure 元数据在某些表单上丢失

macros - 跨 CMakeLists 的 CMake 宏

clojure - 在 clojure 中打印符号列表

Clojure:轻量级 jail

data-structures - Clojure集的背后的数据结构是什么?

clojure - 这个函数的返回值是多少?