是否有支持链式符号的编程语言a< b< c代替< b和b< c在条件语句中?
示例:
第一个陈述对我来说更好,它更容易理解,编译器可以使用及物性来警告错误(例如5
答案 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) { }
对我来说似乎很清楚,我知道它的作用,我知道编码器的意图。