编程语言中的链式不等式表示法

时间:2010-04-15 09:18:53

标签: programming-languages conditional

是否有支持链式符号的编程语言a< b< c代替< b和b< c在条件语句中?

示例:

  1. if(2
  2. if(2< x& x< 5< 5)
  3. 第一个陈述对我来说更好,它更容易理解,编译器可以使用及物性来警告错误(例如5

3 个答案:

答案 0 :(得分:13)

Python就是这么做的。

答案 1 :(得分:6)

Icon这样做,并不是任何hacky特殊情况“链接”的一部分;它是Icon的目标导向评估模型的一部分。任何比较成功失败。如果成功,它会产生右侧。所以你可以写

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

它的工作方式与您期望的完全一致。但它不仅适用于比较,还适用于任何表达;这意味着您可以编写自己的功能,以完全相同的方式“链接”。我喜欢Icon的这个方面,希望更多的语言可以纳入目标导向的评估。

N.B。在Guido在VHLL(20世纪90年代中期)介绍Python的论文中,他明确提到Icon是Python设计中的灵感来源。

答案 2 :(得分:3)

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

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

所以

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”会不会快捷?

考虑最后的判断,大致评估(英文)为“5小于某个小于2的值”这应该是不可能的,但根据实施和副作用,有可能是某些功能( Random.NextInt())可以通过这两个测试。

因此,出于这个原因,需要对每个项目进行一次评估,将其保存到本地变量中以进行下一次比较。但后来你遇到了捷径问题。

public int GetOne()
{
   return 1;
}

public int GetVar()
{
   return -1;
}

(GetOne() < GetVar() < GetDBVal() < GetUserInput())

通常,您希望在执行数据库命中之前先检查常量和变量。但是,如果我们说(如前所述)所有值必须提前保存到局部变量中,这意味着它可能正在调用数据库命中,并询问用户信息,即使“GetVar()”是 - 1,所以第一次比较失败了)

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