在编写某些布尔表达式时,我必须参与到某种过度冗长,至少在我使用的所有语言中,我想知道是否有任何语言可以让你写更简洁?
它的方式是这样的:
我想知道我是否Thing
可以是A
,B
,C
或D
。
我想看看Thing
是A
还是B
。
我表达这个的合理方式是
//1: true if Thing is an A or a B
Thing == (A || B)
然而我所知道的所有语言都希望它被写成
//2: true if Thing is an A or a B
Thing == A || Thing == B
是否有支持1的语言?除非Thing
是布尔值,否则它对我来说似乎没有问题。
答案 0 :(得分:2)
是。图标确实。
作为一个简单的例子,这里是如何得到所有小于1000的数字的总和,可以分为三或五(Project Euler的第一个问题)。
procedure main ()
local result
local n
result := 0
every n := 1 to 999 do
if n % (3 | 5) == 0 then
result +:= n
write (result)
end
请注意n % (3 | 5) == 0
表达式。我对精确的语义有点模糊,但在Icon中,布尔的概念与其他语言不同。每个表达式都是一个生成器,它可以传递(生成一个值)或失败。当在if
表达式中使用时,生成器将继续迭代,直到它通过或耗尽自身。在这种情况下,n % (3 | 5) == 0
是一个生成器,它使用另一个生成器(3 | 5)
来测试n
是否可以被3或5整除。(完全是技术性的,这甚至不是语法糖。 )
同样,在Python(受Icon影响)中,您可以使用in
语句来测试多个元素的相等性。它虽然比Icon弱一点(因为你不能直接翻译上面的模数比较)。在您的情况下,您可以编写Thing in (A, B)
,它可以完全转换为您想要的内容。
答案 1 :(得分:1)
除了尝试向条件运算符添加任何魔法外,还有其他方法可以表达该条件。
在Ruby中,例如:
$> thing = "A"
=> "A"
$> ["A","B"].include? thing
=> true
答案 2 :(得分:1)
我知道你正在寻找具有该语言内置功能的答案,但是这里还有另外两种方法,我发现它们可以更好地解决更多问题并且已经使用了几十年。
您是否考虑过使用preprocessor?