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)
重复并尝试具有相同的通用结构,只接受单个语句或开始 ... 结束块,而不是具有未正式阻止开头和结尾的语句列表,这不是更好吗?
需要开始/结束的表单都存在于一行中 - 编译器没有其他方法可以知道块结束的位置.不需要开头/结尾的表单有一个结束结构,告诉编译器结束的位置,因此开始/结束只是多余的.如果你愿意,你可以在这种情况下自由使用它.
Niklaus Wirth(Pascal的设计师)用他的下一代语言Modula-2纠正了这些不一致.在Modula-2中,复合语句IF不BEGIN具有强制性和强制性END:
IF {condition} THEN
{statement-list}
END;
Run Code Online (Sandbox Code Playgroud)
其他控制结构如WHILE类似且一致REPEAT.
问题是:难道不是更好吗?
答案是:这取决于,因为这种事情完全是主观的.除非你是一台机器,否则就是这么想的.
是的,它会满足一些为了一致性来强制执行所有复合语句的开始/结束,但是如果周围的语言元素已经提供了一个自然的外壳,那么要求它是完全多余的.
考虑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一致性,即使代码编写符合的规则有更大的一致性.