为什么(或<falsey value> <falsey value>)返回Clojure中的最终值?

iff*_*_or 1 boolean clojure

我开始使用Clojure并注意到虽然Clojure的or行为被称为返回第一个truthy值,但传递两个falsey值只or返回第二个值:

user=> (or false false)
false

user=> (or false nil)
nil
Run Code Online (Sandbox Code Playgroud)

我的经验主要是在Python中,其中

>>> False or False
False
Run Code Online (Sandbox Code Playgroud)

这些不相似吗?我理解这是每个http://clojuredocs.org/clojure.core/or的预期行为,并遵循建议查看http://clojuredocs.org/clojure.core/if,但仍不清楚为什么会如此.

noi*_*ith 5

我认为doc字符串表明了这一点.它永远不会承诺返回虚假 - 只是为了在没有其他人留下的情况下返回最后一个论点.

user=> (doc or)
-------------------------
clojure.core/or
([] [x] [x & next])
Macro
  Evaluates exprs one at a time, from left to right. If a form
  returns a logical true value, or returns that value and doesn't
  evaluate any of the other expressions, otherwise it returns the
  value of the last expression. (or) returns nil.
nil
Run Code Online (Sandbox Code Playgroud)

另外,我不知道你在哪里有or两个参数的想法.

user=> (or nil false false false 1 (println "this is not printed"))
1
user=> (or nil false)
false
user=> (or true)
true
user=> (or)
nil
Run Code Online (Sandbox Code Playgroud)

  • 具有短路和任意参数计数的广义"或"可以追溯到lisp的古代历史,它仍然存在,因为它是有用的. (2认同)