在 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
)。