4

在 Common LISP 中,您可以执行以下操作

(macro lambda (x) (list (quote car) (list (quote cdr) x)))

看起来这在 Clojure 中是不可能的(匿名宏)。

  1. 这是真的?
  2. 为什么这个被遗漏了?
4

2 回答 2

4

有一些macrolet(或其他东西)在clojure.contrib.macro-utils. 然而,它对我来说有点像黑客。包含在clojure.coreTODO 雷达上,但目前没有高优先级。

编辑:另见这里http://dev.clojure.org/display/design/letmacro

于 2010-11-02T07:03:27.880 回答
1

据我了解(通过阅读文档源代码),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 阶段,但完全可操作)带来了各种其他增强功能,例如符号宏,因此可能也值得一看。

于 2010-11-02T12:39:19.980 回答