我对能够用这样的某种语言编写 if 语句有微弱的记忆:
if (foobar == ("this" || "that"))
代替:
if (foobar == "this" || foobar == "that")
后者更冗长,因此对我的审美吸引力较小。
任何主要语言都支持以前的约定吗?这是否没有得到广泛支持的原因?
我对能够用这样的某种语言编写 if 语句有微弱的记忆:
if (foobar == ("this" || "that"))
代替:
if (foobar == "this" || foobar == "that")
后者更冗长,因此对我的审美吸引力较小。
任何主要语言都支持以前的约定吗?这是否没有得到广泛支持的原因?
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。)
我似乎记得帕斯卡有一个in
声明,如:
if x in (foo, bar) then
...
至于为什么它没有得到更广泛的支持,让我大吃一惊。这似乎是一块相当不错的语法糖。
我记得使用该语法的唯一地方是大约 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))
您可以限制可以使用此类语法的类型,但随后您将异常堆积在理想情况下应该是正交语法的基础上。这会使用户感到困惑并使编译器复杂化。
它还强制表达式在条件语句中的计算方式与在赋值语句中的不同。这无疑也会使编译器复杂化。
它当然可以工作,但我认为它需要带有重载符号的新语法,并且所有这些都是为了获得可疑的收益。
交互式小说(文本冒险)创作语言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)”表示法现在可能已经占据了这个利基市场。
该||
运算符是一个二元运算符,它接受两个操作数并返回一个值。由于大多数主要语言中表达式的计算方式,不可能使用该语法来检查一个值是否等于一组值中的一个。这就是为什么大多数主要语言都不支持它的原因。
in
但是,@1800 INFORMATION 发布的语法受到许多语言的支持。如果您的语言不支持它,您可以创建一个名为in()
or的函数,该函数in_array()
接受两个参数,一个值和一个数组,true
如果数组包含该值,则返回。(例如,PHP 有一个内置的in_array()函数。)
在 Python 中你可以这样写
if(foobar in ('this', 'that', 'and something else'))
('this', 'that', 'and something else') - 这是一个列表类型。
所以,我认为在任何 oop 语言中,您都可以创建自己的类:
MyClass(object):
List values
def in(value):
return search_value_in_values(value)
并写出这样的东西:
if(new MyClass('this', 'that', 'and something else').in(foobar))