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

Programming languages 对链式比较运算符(x<;y<;z)的语言支持,programming-languages,syntax,operators,Programming Languages,Syntax,Operators,发布了一篇关于链式比较运算符及其在不同语言中的解释的文章 链接比较运算符意味着(x

发布了一篇关于链式比较运算符及其在不同语言中的解释的文章

链接比较运算符意味着
(x
将被解释为
((x
,而不是
((x

关于这个问题的评论表明Python、Perl 6和Mathematica支持链接比较运算符,但是还有哪些其他语言支持此功能,为什么它不更常见

快速查看Python文档可以看出,至少从1996年起,这个特性就已经存在了。是否有其他语言没有添加此语法的原因


静态类型的语言在类型转换方面会有问题,但还有其他原因导致这种情况不常见吗?

好处太小,无法证明使语言复杂化的合理性


您不需要经常使用它,而且只需几个字符就可以轻松地获得相同的效果。

我认为图标是具有此功能的原始语言,而在图标中,布尔值被视为特殊的“fail”标记,而所有其他值都被视为true。

(可能还有大多数其他Lisp系列语言)在其语法中有效地支持多重比较:

(< x y z)

这可以看作是
的一个普通函数应用程序,它应该更常见,但我怀疑这不是因为它使解析语言更复杂

好处:

  • 坚持最不出人意料的原则
  • 读起来像是教数学
  • 减少认知负荷(见前2点)
缺点:

  • 这种语言的语法更复杂
  • 特殊情况句法分析
至于原因,我猜测是:

  • 语言作者没有想到这一点
  • 在“很高兴拥有”名单上
  • 决定它不足以证明实施

自20世纪60年代末以来,链式比较是BCPL的一项功能。

好问题。在我看来,它至少对Java是向后兼容的。(因为
不是为布尔定义的。)我认为这并不常见,因为程序员太习惯于
,为什么静态类型的语言在这方面会有问题?你的意思是什么类型转换?不,你不需要动态类型。首先,静态类型不能阻止布尔运算符。第二,即使它阻止了布尔运算符。这个功能也不需要布尔运算符上的
ns,它要求编译器将
x>y
重写为
x>y和y
。你不能通过在布尔值上定义
来解决这个问题,但是因为这些都没有定义(这是毫无意义的),可以将此功能添加到例如Java中,而不破坏尝试对布尔值排序的现有代码。是的,抱歉,我错误地组合了这些问题。这仍然让我想知道为什么这不是更常见的语法。增加的复杂性似乎是一个糟糕的原因。我想不出当前功能在动态环境中有用的原因打字语言,虽然这会增加额外的功能,但不会有太多冲突。在我看来,这也更容易阅读。我倾向于同意。这是百万分之一的简洁语言,但它确实需要很多麻烦才能实现并融入语法。@Alan你千万不要这样想。相反,你必须改变它,你认为呢在中,与规范、记录、计划、实现和测试它所需的工作相比?@Alan:至于复杂性投票:还有什么其他功能“期望”拥有该功能(例如自定义重载运算符),以及让它们明确工作有多复杂?这会引入潜在的解析歧义吗(ala C++'s
std::list
problem)?您是否希望它短路求值(
foo(value)
-如果
foo(value)
为false,是否会调用bar?),为什么?为了支持任何新的语言功能,特别是那些在流行语言中不常用的功能,需要做大量的调查。如何教授“数学”这不一定是一个好处。数学思想的传授方式,甚至是它们的书写方式往往不能反映出正确的基本思想。非专业人士现在尝试编程更为常见,但真正深入的编程最终需要更好地理解函数符号和概念(例如,lambda表达式)“x