読者です 読者をやめる 読者になる 読者になる

(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

(Boolean. false) の Clojure での扱い

Clojure stackoverflow

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.

JavaClojure を比較してみます。

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) は使うべきではないってところで気をつけましょう。