defmacro 定义之后查看 clojure.core 文件时,您会看到以下代码:

(. (var defmacro) (setMacro))

这是什么意思和做什么?

最佳答案

. 的含义如 Joost 和 Jeremy 的回答所解释。如果您想知道此特定方法调用完成的详细信息:

这基本上将一个名为 :macro 且值为 true 的键插入到名称为 clojure.core/defmacro 的 Var 的元数据映射中。这样做的结果是,从现在开始,如果编译器在解析为 var defmacro ( #'clojure.core/defmacro#'foo 的简写)的上下文中遇到符号 (var foo) —— 通常会无处不在,尽管您可以例如用 let 绑定(bind)的局部变量隐藏这个 Var——它会知道它应该在宏名称的情况下适本地对待它。

(也就是说,要么(1)使用绑定(bind)到 #'clojure.core/defmacro 的函数扩展宏调用,如果符号 defmacro 出现在操作符位置,即紧邻开括号的右侧,要么抛出异常以提示宏在非运算符(operator)位置提及姓名。)

顺便说一句,Clojure 编译器通常会在 Vars 上使用这种元数据映射,例如决定各种对象的类型(参见 :tag 元数据)或是否内联函数调用(IIRC、:inline:inline-arities)。

10-08 12:45