In this video, Rich Hickey introduced Clojure for Lisp programmers.
At time 01:10:42, he talked about nil/false/end-of-sequence/'() among Clojure/Common Lisp/Scheme/Java. He said: "Scheme has true and false, but they are broken."
![](https://www.manongdao.com/static/images/pcload.jpg)
I don't understand why he said that and why does he consider it's "broken"?
It strikes me you'd rather see it from the horse's mouth, so here's a choice extract from a message Rich posted:
Scheme #t is almost completely
meaningless, as Scheme conditionals
test for #f/non-#f, not #f/#t. I don't
think the value #f has much utility
whatsoever, and basing conditionals on
it means writing a lot of (if (not
(null? x))... where (if x... will do
in Clojure/CL, and a substantial
reduction in expressive power when
dealing with sequences, filters etc.
The links in that message are also worthwhile, though the second one may be a bit poetic.
From the chart you posted I'd assume it's because Scheme unlike all the other languages in the chart uses something other than nil
or false
for end-of-seq
. Since '()
is non-#f
it would be a truthy value in a conditional, but acts as a falsy value for end of sequence checks.
In Scheme any value (apart from #f which is False) can be used as True in a conditional test. More info here.
Update
Forget this answer, since it's the same for Clojure of course. I don't like this implicit truth for all values that are not false, for example in (println (if 1 "true" "false")). Personally I would consider that broken but Rich is probably thinking of something else.