Clojure 的父亲为什么说 Scheme 的 true / false 被破坏?

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."

slide

I don't understand why he said that and why does he consider it's "broken"?

转载于:https://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-schemes-true-false-are-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.

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.

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.