在 Common LISP 中,您可以执行以下操作
(macro lambda (x) (list (quote car) (list (quote cdr) x)))
看起来这在 Clojure 中是不可能的(匿名宏)。
- 这是真的?
- 为什么这个被遗漏了?
在 Common LISP 中,您可以执行以下操作
(macro lambda (x) (list (quote car) (list (quote cdr) x)))
看起来这在 Clojure 中是不可能的(匿名宏)。
有一些macrolet
(或其他东西)在clojure.contrib.macro-utils
. 然而,它对我来说有点像黑客。包含在clojure.core
TODO 雷达上,但目前没有高优先级。
据我了解(通过阅读文档和源代码),Clojure 当前(从 1.2 版开始)仅支持使用 defmacro 定义的命名宏。
但是,您可以通过直接在某个匿名 var 上调用 Java 函数Var.setMacro()来滥用 Clojure 的内部结构来获取某种匿名宏。这就是 defmacro 在底层使用来构造宏。
例如你可以这样做:
(def macro-var (var (fn [...] ...)))
(.setMacro macro-var)
Clojure 阅读器随后会将 macro-var 中包含的 var 解释为宏。但是,您必须弄清楚如何正确定义所有内容,并且可能会在 Clojure 的未来版本中全部中断。
Clojure 1.3(目前处于 alpha 阶段,但完全可操作)带来了各种其他增强功能,例如符号宏,因此可能也值得一看。