有人可以解释一下clojure的不寻常的运算符吗?
为什么or
首先返回真或最后一个返回假?为什么and
首先返回假或最后一个为真?
他们为什么不true
或false
返回?
方便。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还利用了它的特性,即所有值都可以强制转换为布尔值,因此or
和and
可以返回最后一个计算的参数而不是相应的布尔值。
为了说明这个问题是关于什么的:
user=> (or [1] nil)
[1]
user=> (or nil [1])
[1]
user=> (and [1] nil)
nil
user=> (and nil [1])
nil
这里[1]
truthy
,nil
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
接受任意数量的参数,相同的规则适用于第三个、第四个和进一步的参数。基本上,他们从左到右评估他们的论点,尽早失败。