or
не является функцией - это макрос. он расширяется до if
звонков и тем самым применяются правила if
: nil
или false
являются плоскими, все остальное правдиво - в том числе 0
.
user=> (when 0 (println "true"))
true
nil
Ваш код расширяется:
user=> (macroexpand '(or 1 0))
(let* [or__4238__auto__ 1] (if or__4238__auto__ or__4238__auto__ (clojure.core/or 0)))
Короче говоря, or
«s сгенерированный код возвращает первый аргумент - truthy или последний.
Так что, если вы хотите знать, если ваш список там содержится какой-либо ноль использовать что-то более подходящее:
user=> (some zero? [1 2 3])
nil
user=> (some zero? [1 2 0])
true
Или в случае 0
существует парам тоже:
user=> (some #{0} [1 2 3])
nil
user=> (some #{0} [1 2 0])
0
Clojure обычно имеет дело с _truthy_ и _falsy_, как указано ниже. Если вы хотите 'true' /' false', функция 'boolean' будет принудительно работать с логикой. '(boolean 0)' дает 'true'. '(boolean nil)' дает 'false'. http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/boolean –