为什么 clojure 运算符不匹配正常的逻辑运算?



有人可以解释一下clojure的不寻常的运算符吗?

为什么or首先返回真或最后一个返回假?为什么and首先返回假或最后一个为真?

他们为什么不truefalse返回?

方便。Clojure拥抱虚假(nil和false都是虚假的)和真实(其他一切)。

(or a b c)

(cond (not (nil? a)) a (not (nil? b)) b (not (nil? c)))

将 nil 视为 false 会使表达式更简短,而返回值往往会使函数和条件更易于组合。例如

(if a b c)

在命令式语言中不会返回任何结果。在 Clojure 中,它返回一个值,以便您可以将表达式与其他表达式组合在一起。

(or (if a b c) (if d e f))

类似地,当语言抽象返回值而不是布尔值时,或和和更易于组合。

(if a (or b c) d)

它真的归结为你想要真/假还是真/假。Truthy/falsey允许更简洁的表达,是Clojure的选择。

这称为短路评估。短路运算符评估获得结果所需的最小参数集。例如,当至少一个参数的计算结果为 true 时,or计算结果为 true,因此or可以在第一个参数true后停止("短路")计算参数并将其返回。

这在许多编程语言(例如C++,Java)中很常见。Clojure还利用了它的特性,即所有值都可以强制转换为布尔值,因此orand可以返回最后一个计算的参数而不是相应的布尔值。

为了说明这个问题是关于什么的:

user=> (or [1] nil)
[1]
user=> (or nil [1])
[1]
user=> (and [1] nil)
nil
user=> (and nil [1])
nil

这里[1] truthynil falsey。真/假是可以被认为是真/假的东西。显然,true的价值是真实的,false的价值是虚假的。

为什么不 and & 或返回布尔值?

嗯,它实际上确实如此:

user=> (or false true)
true
user=> (or true false)
true
user=> (or false false)
false
user=> (or true true)
true
user=> (and false true)
false
user=> (and true false)
false
user=> (and false false)
false
user=> (and true true)
true

因此,这并不是说and or不遵守逻辑定律。它们的功能已扩展为提供对其他类型的支持。其他用法源于此。

短卷

忘了提到这一点,直到我看到亚历克斯·菲拉托夫的回答。如果要and/or的第一个表达式的计算结果为 truey/falsey,则根本不计算第二个参数:

user=> (or true (do (prn :huh) false))
true
user=> (and false (do (prn :huh) true))
false

因此与if&cond相似。

请注意,and & or 接受任意数量的参数,相同的规则适用于第三个、第四个和进一步的参数。基本上,他们从左到右评估他们的论点,尽早失败。

最新更新