【问题标题】:Languages that support boolean syntactic sugar支持布尔语法糖的语言
【发布时间】:2013-07-03 18:06:16
【问题描述】:

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

它的方式是这样的:

我想知道我是否有一个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 是一个布尔值。

【问题讨论】:

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


    【解决方案1】:

    是的。图标可以。

    作为一个简单的例子,这里是如何获得小于 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),它完全可以翻译成你想要的。

    【讨论】:

      【解决方案2】:

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

      在 Ruby 中,例如:

      $> thing = "A"
       => "A"
      $> ["A","B"].include? thing
       => true 
      

      【讨论】:

      • 这是一种很好且相当简洁的方法,虽然有点不直观。
      • 对于没有内置这种功能的主流语言,有一些流行的库可以添加这种功能。
      【解决方案3】:

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

      您是否考虑过使用preprocessor

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

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 2015-02-08
        • 2011-11-08
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        相关资源
        最近更新 更多