我有一种微弱的记忆,能够用这样的语言编写if语句:
if (foobar == ("this" || "that"))
而不是:
if (foobar == "this" || foobar == "that")
后者更冗长,因此对我来说不那么美观了。
以前的会议是否支持任何主要语言?有没有理由不支持这一点?
答案 0 :(得分:4)
Icon编程语言具有此功能。
通过使用生成器,你可以做到
if i = (0 | 1) then write("0 or 1")
如果i = 0或i = 1,成功。你甚至可以这样做:
if (i | j | k) = (0 | 1) then write("0 or 1")
如果i,j或k中的任何一个等于0或1,则成功。
这背后的基本思想是每个(1|2|3..)
序列创建一个生成器,它将依次返回每个值,直到它用完值。当您在这样的布尔引用中使用生成器时,将从生成器请求值,直到比较成功为止。当您在比较的任一侧组合两个生成器时,将尝试所有可能的组合,直到一个成功。 (如果值不相等,则不等于返回false,等于运算符“失败”。)
答案 1 :(得分:2)
我似乎记得Pascal有一个in
声明,如:
if x in (foo, bar) then
...
至于为何没有得到更广泛的支持,打败了我。这似乎是一段非常好的语法糖。
答案 2 :(得分:2)
我记得使用该语法的唯一地方是大约25年前的COBOL。
我怀疑它没有被广泛支持的原因是因为它导致了编译器无法解决的模糊性。在你的特定情况下,它不是一个特殊的问题,因为“this”和“that”是字符串,条件OR运算符没有意义。但请考虑使用C语言的这个片段,其中条件的结果是布尔值0或1:
int a = 22;
int b = 99;
int rslt = SomeFunction();
if (rslt == (a || b))
此时编译器无法可靠地确定您想要的内容。你打算这个:
if (rslt == a || rslt == b)
或者,您打算:
if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1))
您可以限制可以使用此类语法的类型,但是您应该在理想情况下应该使用正交语法来填充异常。这将使用户感到困惑并使编译器复杂化。
它还强制在条件语句中以不同于赋值语句的方式评估表达式。这也无疑会使编译器复杂化。
当然可以使它工作,但我认为它需要带有重载符号的新语法,并且所有这些都是可疑的。
答案 3 :(得分:1)
交互式小说(文本冒险)创作语言Inform使用'或'运算符支持它(与通常的逻辑不同或写成'||'):
if (qty==2 or 3)
print "some";
else
print "many";
有没有理由不支持这一点?
这有点特殊 - 魔术;除了简单的示例表达之外,还不清楚它在其他任何方面的作用。
if (n or 8==m+(1 or 2) or 7) // plausible
if (qty<4 or 5) // huh?
a= "cat" or "dog" // er
Python和其他现代脚本语言中的'if value in(sequence)'表示法现在可能已经占据了这个利基市场。
答案 4 :(得分:0)
||
运算符是一个二元运算符,它接受两个操作数并返回一个值。由于在大多数主要语言中计算表达式的方式,因此不可能使用该语法来检查值是否等于一组值中的一个。这就是大多数主要语言都不支持的原因。
但是,@ 1800 INFORMATION发布的in
语法受到许多语言的支持。如果您的语言不支持它,您可以创建一个名为in()
或in_array()
的函数,它接受两个参数,一个值和一个数组,如果数组包含,则返回true
那个价值。 (例如,PHP有一个内置的in_array()函数。)
答案 5 :(得分:0)
在Python中你可以像这样写
if(foobar in ('this', 'that', 'and something else'))
('this','that','和其他东西') - 这是一个列表类型。
所以,我认为在任何oop语言中你都可以创建自己的类:
MyClass(object):
List values
def in(value):
return search_value_in_values(value)
并写下这样的内容:
if(new MyClass('this', 'that', 'and something else').in(foobar))