【问题标题】:Why is a Boolean expression (with side effects) not enough as a statement?为什么布尔表达式(具有副作用)不足以作为语句?
【发布时间】:2023-03-20 23:02:02
【问题描述】:
function A: Boolean;
function B: Boolean;

我(不小心)写了这个:

A or B;

取而代之的是:

if not A then
  B;

编译器拒绝第一种形式,我很好奇为什么?

通过短路评估,他们都会做同样的事情,不是吗?

澄清:我想知道为什么该语言没有设计为允许我作为陈述表达。

【问题讨论】:

  • 实际上,我很高兴这是不允许的,因为恕我直言,它根本不可读。不过很有趣的问题。
  • 因为 Delphi 还不是 PHP 的分形。

标签: delphi expression delphi-xe2 language-design


【解决方案1】:

第一个是表达式。表达式被评估。表达式没有可见的副作用(例如读取或写入变量)。表达式的两个操作数都是函数,它们可能有副作用,但为了产生副作用,必须执行一条语句。

第二个是声明。它比较表达式的结果并根据评估调用另一个函数。

令人困惑的是,在这种情况下,Delphi 允许我们忽略函数的结果并将其作为函数执行。所以你对A or B 也有同样的期望。但这是不允许的。这很好,因为行为是模棱两可的。例如,如果您启用了惰性评估。 A 计算结果为真,B 称为是或否。

【讨论】:

  • 值得指出的是,您可以同样构造一个有效的语句,该语句也将根据惰性评估模棱两可地执行Bif (A or B) then...
  • "表达式没有可见的副作用(如读取或写入变量)。"写一个变量一个可见的副作用!更何况函数调用也是表达式,当然会有副作用。
【解决方案2】:

很简单,因为编译器需要 statement 并且您提供的表达式不是语句。

请咨询documentation,您将找到一份有效声明列表。在该列表中找不到您的表达方式。

您在(现已删除的)cmets 中问为什么语言设计者选择不将这样的表达式算作陈述。但是这个问题暗示了可能没有目的的目的。设计师没有决定不这样做是完全合理的。相反,他们从来没有考虑过这样做。语言通常旨在解决特定问题。设计者根本没有考虑将此类表达式视为语句,这完全合理。

【讨论】:

    【解决方案3】:

    第一种形式是计算结果为布尔值的表达式,而不是语句。

    【讨论】:

      【解决方案4】:

      Delphi 的核心是 Pascal。 Pascal 语言由 Nicklaus Wirth 设计并于 1968 年出版。我的用户手册和报告的副本是 1978 年的。它的设计有两个目的,作为一种教学语言和一种易于在任何给定机器上实现的语言.在这方面,他取得了惊人的成功。

      Wirth 非常熟悉当时的其他语言(包括 Fortran、Cobol 和特别是 Algol),并出于特定目的做出了一系列谨慎的选择。特别是,他小心地将“行动”的概念与“价值观”分开。 Pascal 中的“动作”是语言中的语句,包括过程调用。 “值”包括函数调用。在这方面和其他一些方面,该语言与 Algol 非常相似。

      声明和使用动作和值的语法被小心地分开。提供的语言和库通常没有“副作用”。过程做事,表达式计算值。例如,'read' 是一个过程,而不是一个函数,因为它检索一个值并在文件中前进,但 'eof' 是一个函数。

      Pascal 的大众市场版本由 Borland 在 1980 年代中期创建,并先后成为 Windows 和 Delphi 的 Turbo Pascal。语言发生了很大变化,并不是所有的语言都像 Wirth 设计的那样纯粹。这是一项幸存下来的功能。

      顺便说一下,Pascal 没有短路评估。它有堆内存和集合,但没有对象。他们来晚了。

      【讨论】:

        猜你喜欢
        • 2020-10-03
        • 1970-01-01
        • 2016-07-03
        • 2015-09-06
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        相关资源
        最近更新 更多