链式比较运算符的语言支持(x <y <z)

Ala*_*nse 21 syntax programming-languages operators

一个问题被张贴有关链比较运营商以及它们如何在不同的语言解释.

链接比较运算符意味着(x < y < z)将被解释为((x < y) && (y < z))而不是((x < y) < z).

对该问题的评论表明,Python,Perl 6和Mathematica支持链接比较运算符,但是其他语言支持这个功能,为什么它不常见?

快速浏览一下Python文档就可以看出这个功能至少从1996年开始.有没有更多语言没有添加这种语法的原因?

静态类型语言会出现类型转换问题,但还有其他原因这种情况不常见吗?

sta*_*lue 13

这种好处太小,无法证明使语言复杂化.

你不经常需要它,并且很容易用更多的几个字符干净地获得相同的效果.

  • 增加复杂性似乎是一个糟糕的理由。我无法想到当前功能在动态类型化语言中有用的原因,而这会添加更多功能而不会产生太多冲突。在我看来,它也更容易阅读。 (3认同)
  • @Alan:至于对复杂性的投票:还有哪些其他功能“期望”拥有该功能(例如自定义重载运算符),以及让它们明确工作有多复杂?它是否会引入潜在的解析歧义(例如 C++ 的 `std::list&lt;std::list&lt;int&gt;&gt;` 问题)?您是否期望它短路评估(`foo(value) &lt; b &lt; bar(value)` - 如果 `foo(value) &lt; b` 为 false,则 bar 会被调用吗?),为什么或为什么不呢?需要进行“大量”调查来支持任何新的语言功能,尤其是那些通常不以流行语言实现的功能。 (3认同)

Bru*_*ong 10

它应该更常见,但我怀疑它不是因为它使解析语言更复杂.

优点:

  • 坚持最不惊讶的原则
  • 像数学一样的阅读教学
  • 减少认知负荷(见前2点)

缺点:

  • 语法对于语言来说更复杂
  • 特殊情况句法糖

至于为什么不,我的猜测是:

  • 语言作者没有想到它
  • 是在'很高兴'列表
  • 被认为没有足够的理由来实施

  • 不同意“坚持最小惊喜原则”:首先吸引我使用 C 的原因之一是,无论上下文如何,每个表达式都具有相同的含义。无论上下文如何,“a &lt; b”始终会导致“1”或“0”。没有什么意外。有时“a &lt; b”是二元“&lt;”运算符,有时是由“&lt;”符号和后面的“&lt;”(或“&gt;”等)组成的三元运算符的一部分,这会增加认知负担在) (3认同)
  • 如何“教授数学”并不一定是一种好处。如何教授数学思想,甚至如何写下数学思想,通常并不能反映正确的基本思想。如今,外行人尝试编程更为常见,但真正深入的编程最终需要更好地理解函数符号和概念(例如 lambda 表达式)。“x &lt; y &lt; z”的正确解释(即读取)始终是“x 小于 y AND y 小于 z”,因此仅要求编程明确就不会有问题。 (2认同)
  • MM,确实如此,但 a &lt; b 减少到 0 或 1 的事实是一个幕后实现细节。从概念上讲,它是一个布尔值而不是数值,因此对于高级语言,0 或 1 不作为可能的解释出现。不过,如果 a &lt; b 是布尔值,那么“true &lt; c 意味着什么”,其中 c 是整数?真的没什么。因此,链接对于高级语言来说可能很好。 (2认同)

Gre*_*ill 5

Scheme(可能还有大多数其他 Lisp 家族语言)在其语法内有效支持多重比较:

(< x y z)
Run Code Online (Sandbox Code Playgroud)

<这可以被认为是具有三个参数的函数的普通函数应用。请参阅规范中的6.2.5 数值运算。

Clojure 也支持链式比较