【发布时间】:2010-04-16 09:55:04
【问题描述】:
是否有一种编程语言支持链式表示法 a
例子:
- 如果 (2
- 如果(2
第一个语句对我来说看起来更好,更容易理解,并且编译器可以使用传递性属性来警告错误(例如 5
【问题讨论】:
标签: programming-languages conditional
是否有一种编程语言支持链式表示法 a
例子:
第一个语句对我来说看起来更好,更容易理解,并且编译器可以使用传递性属性来警告错误(例如 5
【问题讨论】:
标签: programming-languages conditional
Python 会这样做。
【讨论】:
a op1 b and b op2 c and ... y opN z,只是每个表达式最多计算一次。
Icon 执行此操作,并且它不是任何 hacky 特殊情况“链接”的一部分;它是 Icon 以目标为导向的评估模型的一部分。任何比较成功或失败。如果成功,则生成右侧。所以你可以写
if 0 <= i <= j < n then ...
它的工作方式完全符合您的预期。但它不仅适用于比较,还适用于 any 表达式;这意味着您可以编写自己的函数以完全相同的方式“链接”。我喜欢 Icon 的这一方面,并希望更多的语言可以包含目标导向的评估。
注意在 Guido 在 VHLL(1990 年代中期)介绍 Python 的论文中,他明确提到 Icon 是 Python 设计的灵感来源。
【讨论】:
这听起来像是一个简单的请求(显然它很简单,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 > 2 && x < 5) { } 对我来说似乎很清楚,我知道它的作用,并且我知道编码器的意图。
【讨论】:
int” 'a < b < c < d 不能再合并为有效语句。