Clojure 中的逻辑真实性

3 clojure

究竟true?说了什么? (true? 0)= false. (if 0 "0 is true" "0 is false")= 0 is true. 为什么会发生这种情况?

Ósc*_*pez 6

在 Clojure 中,nilandfalse被视为“假”,其他所有内容都被考虑true,这解释了if您的问题中表达式的行为。

另一方面,true?谓词true仅在提供了true值时才有效。

有关更多信息,请查看本文讨论 Clojure 中的 Truthy 和 Falsey 概念。

  • 请_do_阅读链接的文章,您必须了解在 Clojure 中我们有“truthy”和“falsey”值。这意味着`1` 不是`true`,而是_is_truthy。`(boolean 1)` 正在执行强制转换,如文档中所述。而 `(false?nil)` 是 `false`,因为 `nil` 不是 `false`,尽管它是 _falsey_。 (4认同)
  • 我发现将“真?”和“假?”类似于“零?”和“零?”会有所帮助。也就是说,它们是检查单个特定值(`true` 或 `false`)的谓词。 (2认同)

Thu*_*ail 5

你混淆了两件事:

  • Clojure 中的不同,以及
  • 的方式,if和它的后代对待这些值。

true1是值,它们是不同的:

(= true 1) ; false
Run Code Online (Sandbox Code Playgroud)

但它们与第一个参数具有相同的效果if

(if true "Hello!" "Goodbye.") ; "Hello!"

(if 1 "Hello!" "Goodbye.") ; "Hello!"
Run Code Online (Sandbox Code Playgroud)

事实上,几乎任何第一个参数都会导致if评估并返回它的第二个参数:

(if + "Hello!" "Goodbye.") ; "Hello!"

(if *ns* "Hello!" "Goodbye.") ; "Hello!"

(if String "Hello!" "Goodbye.") ; "Hello!"
Run Code Online (Sandbox Code Playgroud)

只有两个导致if评估并返回其第三个参数。这两个值是falsenil

(if false "Hello!" "Goodbye.") ; "Goodbye."

(if nil "Hello!" "Goodbye.") ; "Goodbye."
Run Code Online (Sandbox Code Playgroud)

如果未提供第三个参数,则默认为nil

(if false "Hello!") ; nil
Run Code Online (Sandbox Code Playgroud)

值之间的相同区别适用于其他 Clojure 条件,它们 - 直接或间接 - 派生自if: if-not, when, when-not, and, or, &c。它们被表示为宏,因此,就像 一样if,它们在需要之前不会评估它们的参数。

引用官方文档

(如果测试然后其他?)

评估test. 如果不是奇异值nilor false,则评估并产生then,否则评估并产生else。如果else未提供,则默认为nil. 所有Clojure中的其他条件句都是基于同样的逻辑,那就是,nilfalse构成逻辑谬误,以及其他一切构成了逻辑真理,而这些意义适用于整个。