【问题标题】:Why not have operators as both keywords and functions?为什么不将运算符作为关键字和函数?
【发布时间】:2015-10-23 01:12:40
【问题描述】:

我看到this 的问题让我感到疑惑。

忽略几乎所有语言都必须向后兼容的事实,是否有任何理由我们不能将运算符用作关键字和函数,这取决于它是否紧跟括号?它会使语法变得更难吗?

我想到的主要是 python,但也有类似 C 的语言。

【问题讨论】:

  • keyword 和 function 的概念是正交的。也就是说,函数名可能是(保留的)关键字,也可能不是。我对 Python 并不十分熟悉,但我阅读其他问题的方式并不是 not(...) 不允许或不起作用,而是它误导了快速读者,因为它可能被解释为函数调用。

标签: grammar


【解决方案1】:

根据语言,not() 未定义。如果 not() 未在某些语言中定义,则不能使用它。为什么 not() 没有用某种语言定义?因为该语言的创造者可能不需要这种语言结构。因为最好让事情变得更简单。

【讨论】:

    【解决方案2】:

    Perl 做的事情与此非常相似,结果有时令人惊讶。您会在许多 Perl 文本中找到关于此的警告;例如,这个来自标准的分布式 Perl 文档(man perlfunc):

    下面列表中的任何函数都可以在其参数周围带或不带括号使用。 (语法描述省略了括号。)如果使用括号,简单但偶尔令人惊讶的规则是:它看起来像一个函数,因此它是一个函数,优先级无关紧要。否则它是一个列表运算符或一元运算符,优先级很重要。函数和左括号之间的空格不算在内,所以有时你需要小心:
     打印 1+2+4; # 打印 7。
         打印(1+2)+4; # 打印 3。
         打印 (1+2)+4; # 也打印 3!
         打印 +(1+2)+4; # 打印 7。
         打印 ((1+2)+4); # 打印 7。
    

    一个更令人惊讶的案例,经常让新人感到痛苦:

     print
          (a % 7 == 0 || a % 7 == 1) ? "good" : "bad";
    

    将打印 0 或 1。

    简而言之,这取决于您的解析理论。许多人认为解析应该是精确和可预测的,即使这会导致令人惊讶的解析(如链接问题中的 Python 示例,或者更著名的是 C++ 的most vexing parse)。其他人倾向于 Perl 的“按我的意思做”的哲学,尽管结果(如上)有时与程序员的实际意思有很大不同。

    C、C++ 和 Python 都倾向于“精确和可预测”的理念,现在不太可能改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多