您可以在http://clojure.org/special_forms#if找到解释。
阅读整段内容很好,但这里是摘录的关键部分,重点补充说:
[...] Clojure 中的所有 [...] 条件都基于相同的逻辑,即nil和false构成逻辑错误,而其他所有内容都构成逻辑真,并且这些含义始终适用。[...]请注意,如果不测试 java.lang.Boolean 的任意值,则仅测试奇异值 false(Java 的 Boolean.FALSE),因此如果您要创建自己的盒装布尔值,请确保使用 Boolean/valueOf 和不是布尔构造函数。
比较
System.out.println(Boolean.valueOf(false) ? true : false); // false
System.out.println(new Boolean(false) ? true : false); // false
和
user=> (if (Boolean/valueOf false) true false)
false
user=> (if (Boolean. false) true false)
true
因此,(Boolean. false)
既不是nil
也不是false
,就像(Object.)
既不是nil
也不是false
。正如@Chiron 指出的那样,无论如何使用它都是不好的做法。
至于(= false (Boolean. false))
是否属实,我认为@looby 的解释是正确的:由于=
依赖于 Java 的equals
方法,因此 Clojure 中条件的特殊语义不适用,布尔相等将与 Java 中一样。