(if test then else?) is inconsistent
Description
Environment
MacOS X 10.10.2
Activity

Andy Fingerhut May 5, 2015 at 11:50 PM
I'd like to withdraw the last 2 sentences of my previous comment. I think Alex's comment is the shortest accurate answer: It was a choice in Clojure's implementation to do this. As it is right now, there are some compiled 'if' expressions that compare the test expression against both nil (Java null) and Java Boolean.FALSE, and allowing (Boolean. false) to also be treated as false would either require comparing against a third value, or calling a method like Boolean.valueOf() before doing the comparison. Perhaps a micro-optimization, but seems to me like a reasonable one, given the recommendations in Java not to use the Boolean constructors.

import May 5, 2015 at 10:51 PM
Comment made by: jigendaisuke
@Andy Fingerhut
I know all that, but this doesn't make it any more consistent
See, if they won't fix how "if" treats custom made false-values, the next best
thing to do were to manifest this behaviour of "if" into the "=" function (and
yes, that would mean that "=" isn't a mere ".equals" call anymore, because
Boolean false-values would have to be treated in a special way). But then at
least we would have a consistent system - though not exactly in the way I'd
prefer.
Therefore, I can't blame Java. If they had implemented "if" right in the first place,
everything were fine. So this one is on Clojure.

Andy Fingerhut May 1, 2015 at 12:12 AM
These all return 2:
(if nil 1 2)
(if false 1 2)
(if Boolean/FALSE 1 2)
clojure.core/=, like Java .equals, returns true when comparing Boolean/FALSE and (Boolean. false). Blame Java.

import April 30, 2015 at 11:08 PM
Comment made by: jigendaisuke
But, if Boolean/FALSE is the false value, shouldn't
(if (= (Boolean. false) false) true false)
better return false?

Andy Fingerhut April 30, 2015 at 9:41 PM
The longish example/article on ClojureDocs.org might contain additional useful info. Even Java recommends against ever using (Boolean. false): http://clojuredocs.org/clojure.core/if
Issue was "fixed" by adding a comment to the documentation.
I think that's not enough, because actually points to a major inconsistency.
Just have a look at the following code:
;; I know, the definition of y is bad code, and I would
;; never write such rubish, BUT some people do (e.g. the
;; guys at MS, responsible for the sqljdbc4.jar JDBC
;; driver).
(def y (Boolean. false))
(if (= false y)
(println "that's ok"))
(if y
(println "that's inconsistent, because y is " y
" and we proved it with the above if statement"))