2

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

它的方式是这样的:

我想知道我是否有一个Thing可以是A, B,CD.

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

4

3 回答 3

2

是的。图标可以。

举个简单的例子,这里是如何得到所有小于 1000 且能被 3 或 5 整除的数的总和(欧拉计划的第一个问题)。

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),它完全转换为你想要的。

于 2013-07-03T19:21:00.677 回答
1

还有其他方法可以表达该条件,而无需尝试为条件运算符添加任何魔法。

例如,在 Ruby 中:

$> thing = "A"
 => "A"
$> ["A","B"].include? thing
 => true 
于 2013-07-03T18:15:53.030 回答
1

我知道您正在寻找具有语言内置功能的答案,但这里有另外两种方法,我发现它们可以更好地解决更多问题并且已经使用了几十年。

您是否考虑过使用预处理器

Lisp这样的语言也有,它是语言的一部分。

于 2013-07-03T19:41:51.150 回答