(Boolean. false) の Clojure での扱い
Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot
にあるように Clojure の中で false として扱われるのは nil と false それ自身だけ。驚くことに全くもってその通りで、 (Boolean. false) は false じゃないんだ。
user=> (if (Boolean. false) 1 2) 1 user=> (not (Boolean. false)) false user=> (false? (Boolean. false)) false
かたや、こちらではどういうわけか false になる。
user=> (class false) java.lang.Boolean user=> (= false (Boolean. false)) true
これはとても直感に反している。こういう振る舞いをするのは何か深いわけがあるのか、それとも何か見落としている?という感じの質問。
これに対する回答ではココに説明が書いてあると書いてあります。全部読むべきだけど、大事なところを抜粋すると。
[...] All [...] conditionals in Clojure are based upon the same logic, that is, nil and false constitute logical falsity, and everything else constitutes logical truth, and those meanings apply throughout. [...] Note that if does not test for arbitrary values of java.lang.Boolean, only the singular value false (Java's Boolean.FALSE), so if you are creating your own boxed Booleans make sure to use Boolean/valueOf and not the Boolean constructors.
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 でもないです。
(= false (Boolean. false)) が true になるのは = が Java の equals メソッドに依存しているからじゃないかな。
というように回答がなされていて、なるほどーなーと思いました。まぁ回答の原文にありましたが、 (Boolean. false) は使うべきではないってところで気をつけましょう。