为什么具有点特殊形式的代码会给出不同的结果?

rus*_*ter 1 clojure

你能解释一下吗?我不明白,为什么具有点特殊形式和恒等函数的几乎相同的代码却有不同的结果?

(. System getProperties) # => {"key" ...}
(. (clojure.core/identity System) getProperties) # => (err) No matching field found: getProperties for class java.lang.Class
Run Code Online (Sandbox Code Playgroud)

我尝试比较一下:

(= (clojure.core/identity System) System) # true
Run Code Online (Sandbox Code Playgroud)

结果是真的

Eug*_*mov 6

静态方法很特殊。

在第一种情况下,编译器认为这System是一个类,并将其.视为静态方法调用(source)。

在第二种情况下,它被视为.对某个类的实例的常规调用,并且System是 class 的实例Class,因此会出现该错误。