为什么Pascal控件结构看起来不一致?

70M*_*ike 7 delphi pascal language-design freepascal

大多数Pascal控件结构对我有意义,例如:

for ... do {statement};

if (condition) then {statement};

while (condition) do {statement};
Run Code Online (Sandbox Code Playgroud)

其中{statement}是单个语句或begin ... end块.我有一个问题:

repeat {statement-list} until (expression);

try {statement-list} except {statement-list} end;
Run Code Online (Sandbox Code Playgroud)

重复尝试具有相同的通用结构,只接受单个语句或开始 ... 结束块,而不是具有未正式阻止开头结尾的语句列表,这不是更好吗?

Lor*_*tel 9

需要开始/结束的表单都存在于一行中 - 编译器没有其他方法可以知道块结束的位置.不需要开头/结尾的表单有一个结束结构,告诉编译器结束的位置,因此开始/结束只是多余的.如果你愿意,你可以在这种情况下自由使用它.


Gre*_*ill 8

Niklaus Wirth(Pascal的设计师)用他的下一代语言Modula-2纠正了这些不一致.在Modula-2中,复合语句IFBEGIN具有强制性和强制性END:

IF {condition} THEN
    {statement-list}
END;
Run Code Online (Sandbox Code Playgroud)

其他控制结构如WHILE类似且一致REPEAT.

  • @ 70Mike:它与解析理论有关.只有在语法树上的下一个节点是单个语句还是块时存在歧义时才需要"开始",就像在Pascal中一样.(并且在C系列中;除了那里他们使用花括号而不是关键字.虽然相同的原则.)**begin**是一个关键字,让解析器知道期望一个块.当您通过使所有内容成为必须以**结尾**结尾的块来禁止单个语句时,则不需要**开始**来告诉解析器有一个块出现. (4认同)
  • 我希望他走另一条路,并且要求所有多语句块"开始" - 只是我的偏好.至少它在Modula-2中是一致的. (3认同)

Del*_*ics 5

问题是:难道不是更好吗?

答案是:这取决于,因为这种事情完全是主观的.除非你是一台机器,否则就是这么想的.

是的,它会满足一些为了一致性来强制执行所有复合语句的开始/结束,但是如果周围的语言元素已经提供了一个自然的外壳,那么要求它是完全多余的.

考虑CASE声明:

// "Sensible" syntax

  case VALUE of
    1: DoSomething;
    2: begin
         DoSomethingElse;
         DoMore;
       end;
  else
    DoForAllOtherValues;
    DoMore;
  end;
Run Code Online (Sandbox Code Playgroud)

与一个不太明智,但更一致和"合乎逻辑":

  case VALUE of
    1: DoSomething;
    2: begin
         DoSomethingElse;
         DoMore;
       end;
  else
    begin
      DoForAllOtherValues;
      DoMore;
    end;
  end;
Run Code Online (Sandbox Code Playgroud)

请注意,最终的"结束"是"案例"的一部分.你不能没有它.

我很确定在Chrome的早期版本(它成为Oxygene和随后的Prism)中,这实际上是case语句的必需语法.如果是这样,情况就不再如此.常识大概占了上风.

在我个人看来,满足OGoSC(目标神的句法一致性)会激怒或许更少,但实际上与你和我更相关,SGoHRaC(人类可读性和理解的主观神).

虽然在许多情况下它可能看起来不同,但我们人类实际上并不是机器.我们不需要将规则简化并简化为最小一致集,以便能够解析文本并理解它.我们需要一些规则,但我们可以处理更多,因为我们对机器的巨大优势是思想自由,将我们从严格的语法和结构方案中解放出来,特别是在这种语法和结构与冗余点无关的情况下.

在这种情况下.

如果你犯了编译器无法解释的错误,它会在每次编译时告诉你.但编译器不会感谢你使代码"更容易""读取"(编译器只是遵循它给出的规则 - 它不会让编译器"更容易"通过更改"读取"代码规则,它已经可以完全愉快地遵循).

如果你强加任意规则使其更难阅读(不是因为规则或多或少不变/一致,而是因为你强加了一个一致的结构,其本身包含更多的噪音和必须过滤的冗余信息),那么你将支付人类生产力的价格.

事实上,这些"更容易"更"一致"的规则实际上可能会使其更加困难......再次考虑CASE声明.

要使该复合开始/结束有意义,我们必须使"case"成为独立语句,而不是case/end对的一部分,因此所有这些都应该是有效的语法:

  case VALUE of
    1: DoSomething;
    2: DoSomethingElse;


  case VALUE of
    1: DoSomething;
    2: DoSomethingElse;
  else
    DoOther;


  case VALUE of
    1: DoSomething;
    2: begin
         DoSomethingElse;
         DoMore;
       end;
  else
    DoOther;


  case VALUE of
    1: DoSomething;
    2: begin
         DoSomethingElse;
         DoMore;
       end;
  else
  begin
    DoOther;
    DoMoreOther;
  end;


  case VALUE of
    1: DoSomething;
    2: begin
         DoSomethingElse;
         DoMore;
       end;
Run Code Online (Sandbox Code Playgroud)

您可能不同意,但在我看来,突然这种更一致的语法实际上导致实际代码中的LESS一致性,即使代码编写符合的规则有更大的一致性.