Clojure的点特殊形式怪异

时间:2015-08-28 08:12:03

标签: clojure clojure-java-interop

我很好奇为什么这样有效(正如我在阅读the documentation on the dot special form后所期望的那样):

(map #(. % isInstance {}) [clojure.lang.IPersistentMap])

返回:

(true)

但这不是:

(. clojure.lang.IPersistentMap isInstance {})

我收到错误,“没有匹配的方法:isInstance”。该表单与上面的map函数调用完全相同,但在map之外,它不起作用。为什么呢?

1 个答案:

答案 0 :(得分:6)

.(点)形式是最奇怪的形式。我不确定我是否会很好地解释它,但试试吧。

docs

  

如果第一个操作数是解析为类名的符号,则该访问被视为指定类的静态成员。请注意,根据JVM规范,嵌套类被命名为EnclosingClass $ NestedClass。 否则,它被假定为实例成员,并且第一个参数被计算以生成目标对象。

强调我的。

所以你用(. clojure.lang.IPersistentMap isInstance {}) - clojure.lang.IPersistentMap解析了第一个案例,并且假设整个表达式是静态方法调用。

map情况下,符号被评估(重点部分),在传递给匿名函数之前求值为clojure.lang.IPersistentMap类对象,整个表达式是对该类的实例方法调用

因此可归结为这样的事实:在一个地方,clojure.lang.IPersistentMap被用作引用类名的符号,而在另一个地方被用作评估类对象的东西。

另见here

  

请注意,类名通常表示类对象,但是以某些特殊形式特殊处理,例如: ''和新的。