支持布尔句法糖的语言

时间:2013-07-03 18:06:16

标签: language-features boolean-logic syntactic-sugar

在编写某些布尔表达式时,我必须参与到某种过度冗长,至少在我使用的所有语言中,我想知道是否有任何语言可以让你写更简洁?

它的方式是这样的:

我想知道我是否Thing可以是ABCD

我想看看ThingA还是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是布尔值,否则它对我来说似乎没有问题。

3 个答案:

答案 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

Lisp等语言也有macros,这是该语言的一部分。