【问题标题】:Chained inequality notation in programming languages编程语言中的链式不等式表示法
【发布时间】:2010-04-16 09:55:04
【问题描述】:

是否有一种编程语言支持链式表示法 a

例子:

  1. 如果 (2
  2. 如果(2

第一个语句对我来说看起来更好,更容易理解,并且编译器可以使用传递性属性来警告错误(例如 5

【问题讨论】:

    标签: programming-languages conditional


    【解决方案1】:

    Python 会这样做。

    【讨论】:

    • @tutuca :我只需要这些信息,所以参考在这里:docs.python.org/2/reference/expressions.html#not-in 。 Quote: 形式上,如果 a, b, c, ..., y, z 是表达式,而 op1, op2, ..., opN 是比较运算符,那么 @ 987654322@ 等价于a op1 b and b op2 c and ... y opN z,只是每个表达式最多计算一次。
    【解决方案2】:

    Icon 执行此操作,并且它不是任何 hacky 特殊情况“链接”的一部分;它是 Icon 以目标为导向的评估模型的一部分。任何比较成功失败。如果成功,则生成右侧。所以你可以写

    if 0 <= i <= j < n then ...
    

    它的工作方式完全符合您的预期。但它不仅适用于比较,还适用于 any 表达式;这意味着您可以编写自己的函数以完全相同的方式“链接”。我喜欢 Icon 的这一方面,并​​希望更多的语言可以包含目标导向的评估。

    注意在 Guido 在 VHLL(1990 年代中期)介绍 Python 的论文中,他明确提到 Icon 是 Python 设计的灵感来源。

    【讨论】:

    【解决方案3】:

    这听起来像是一个简单的请求(显然它很简单,python 实现了它),但它不一定那么容易使用。它实际上打开了导致许多错误的能力。

    具体来说,任何时候使用函数(或 C# 中的属性,Java 的 Getter)

    所以

    public int GetX()
    {
       return 4;
    }
    
    (2 < GetX() < 5);
    
    (2 < GetX() > 5);
    
    (5 < GetX() < 2);
    

    看起来真的很简单。但是如果 GetX() 有副作用,就会出现问题。

    private int val = 10;
    
    public int GetCountdown()
    {
       return val--;
    }
    
    (2 < GetCountdown() < 5);
    
    (2 < GetCountdown() > 5);
    
    (5 < GetCountdown() < 2);
    

    在这种情况下,“GetCountdown()”是递减两次还是只递减一次? “chained-if-statement”会不会走捷径?

    考虑最后一条语句,它粗略地评估(英文)为“比小于 2 的某个值小 5)这应该是不可能的,但根据实现和副作用,某些功能( Random.NextInt()) 可以通过这两个测试。

    因此,出于这个原因,需要每个项目只评估一次,并将其保存到局部变量中以供下次比较。但是你会遇到捷径问题。

    public int GetOne()
    {
       return 1;
    }
    
    public int GetVar()
    {
       return -1;
    }
    
    (GetOne() < GetVar() < GetDBVal() < GetUserInput())
    

    一般来说,您需要先检查常量和变量,然后再进行数据库访问。但是如果我们说(正如我们之前所说)必须提前将所有值保存到局部变量中,这意味着它可能会调用数据库命中,并询问用户信息,即使“GetVar()”是 - 1,所以第一次比较失败)

    正如我之前所说,显然 Python 允许这种语法,所以它显然是可能的。但是,不管我列出的技术含义(所有这些都很容易设计),这意味着您的代码不太清晰,因为下一个阅读它的人不知道是否你已经考虑了这一切。而if(x &gt; 2 &amp;&amp; x &lt; 5) { } 对我来说似乎很清楚,我知道它的作用,并且我知道编码器的意图。

    【讨论】:

    • 好吧,“GetDataFromDB()” 本身不会有“副作用”,只是它需要一些最好避免的时间。这样做的目的只是为了说明链接比较本身可能会产生意想不到的后果,因为它不像原子比较那样清晰。
    • 从中吸取的教训是始终使用具有副作用的函数(我认为 GetDataFromDB() 具有副作用:它触及外部世界)作为语句。仅使用无副作用的代码作为表达式
    • 但那是编码练习。用户仍然可以滥用它。理想情况下,一种语言应该既简单又直观,可以让最多人数的人使用,同时又易于其他人阅读和理解。还应该建立它以阻止或突出不良做法。在这种情况下,不好的做法更容易被语法隐藏和掩盖。
    • 同样,当您尝试这样做时提供的编译器错误阐明了语言设计者的意图。 “错误:运算符 'bool 和 int” 'a < b < c < d 不能再合并为有效语句。
    • 嘿,权力越大,责任越大;)
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多