clojure.core :. operator,defmacro和setMacro

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

(. (var defmacro) (setMacro))

这意味着什么?

最佳答案
的含义 .正如Joost和Jeremy的回答所解释的那样.如果您想知道这个特定方法调用所完成的细节:

这基本上将一个名为:macro的键插入名为clojure.core / defmacro的Var的元数据映射中,其值为true.这样做的结果是,从这一点开始,如果编译器在上下文中遇到符号defmacro,它解析为var#’clojure.core / defmacro(#’foo是(var foo)的缩写) – 这将是通常在任何地方,尽管你可以,例如使用一个let-bound局部变量来影响这个Var – 它将知道它应该在宏的名称的情况下适当地对待它.

(也就是说,或者(1)使用绑定到#’clojure.core / defmacro的函数扩展宏调用,如果符号defmacro出现在操作符位置,即紧接在开头paren的右边,或者抛出一个抱怨在非运算符位置提到宏名称的例外情况.)

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

转载注明原文:clojure.core :. operator,defmacro和setMacro - 代码日志