7

ほとんどのPascal制御構造は、次のように私には意味があります。

for ... do {statement};

if (condition) then {statement};

while (condition) do {statement};

ここで、{ステートメント}は単一のステートメントまたは開始...終了ブロックのいずれかです。私は問題を抱えています:

repeat {statement-list} until (expression);

try {statement-list} except {statement-list} end;

beginendで正式にブロックされていないステートメントリストを使用するのではなく、同じ一般的な構造を繰り返し試行し、単一のステートメントまたはbegin ... endブロックのみを受け入れる方がよいのではないでしょうか。

4

7 に答える 7

9

begin/end を必要とするフォームはすべて 1 行に存在します。コンパイラには、ブロックの終了位置を知る方法が他にありません。開始/終了を必要としないフォームには、終了する場所をコンパイラに伝える終了構造があるため、開始/終了は単純に冗長になります。ただし、必要に応じて、この場合は自由に使用できます。

于 2011-01-07T00:48:48.973 に答える
8

Niklaus Wirth(Pascalの設計者)は、次の言語であるModula-2でこれらの矛盾を修正しました。Modula-2では、次のような複合ステートメントにIFはnoBEGINと必須がありENDます。

IF {condition} THEN
    {statement-list}
END;

のような他の制御構造WHILEは、と類似しており、一貫していREPEATます。

于 2011-01-07T00:05:29.740 に答える
5

質問は:それはより良いのではないでしょうか?

答えは次のとおりです。この種のものは完全に主観的であるため、それは異なります。あなたが機械であるか、そのように考えない限り。

はい、すべての複合ステートメントに開始/終了を強制することは一貫性に対するいくらかの苦痛を満たしますが、周囲の言語要素がすでに自然な囲いを提供している場合、これを要求することは完全に冗長です。

CASEステートメントについて考えてみます。

// "Sensible" syntax

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

あまり賢明ではないが、より一貫性があり「論理的」であるのに対して:

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

最後の「終了」は「ケース」の一部であることに注意してください。それなしではできません。

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;

同意できないかもしれませんが、コードが準拠するように記述されているルールの一貫性が高くても、このより一貫性のある構文により、実際のコードの一貫性が実際に低くなるように思われます。

于 2011-01-07T00:49:47.197 に答える
3

おそらく。しかし、言語設計、特に少し歴史のある言語は、単純で理想的なものになることはめったにありません。

他の言語でも同様のことがわかります。たとえば、Javaは後にブロックを必要とtryし、単一のステートメントを許可しませんが、他の制御構造を見るだけでも単一のステートメントが機能する場合があります。

なぜswitchCと派生言語では単一のブロックであり、個々のケースはそうではないのですか?

于 2011-01-07T00:03:23.170 に答える
2

これは、パーサーの動作方法と関係があります。開始/終了、試行/例外、繰り返し/すべてにステートメントのブロックが含まれるまで。パーサーのコードは、beginブロック(擬似コード)の場合、次のようになります。

procedure ReadBlock;
begin
  Match('begin');
  while CurrentToken <> 'end' do
    ReadStatement;
  Match('end');
end;

そして、それはそのタイプのブロックにはうまく機能します。ただし、ブロックの終了行に追加情報(repeat / untilの条件、およびtryの例外処理ブロック)が必要な場合は、終了まで実行しないようにします。これは、言語の文法では想定されていません。その後に何かがあります。文法を変更することもできますが、それではパーサーが非常に複雑になります。したがって、代わりに別のキーワードを選択するだけです。

于 2011-01-07T01:14:15.510 に答える
1

あなたは間違った質問をしていると思います。つまり、if/while/for グループと repeat/try グループの違いを見ていないのかもしれません。

最初のグループには、何かを開始するために何か (条件または引数) が必要です。代わりに、2 番目は何かを BEGIN することを意味します。単語を読んでください: 繰り返し (以下)、試してください (以下)。

Pascal は、通常の人間の読者向けに設計されているため、クリーンでシンプルかつエレガントです。Wirth 教授は、設計時にプログラミングを学ぶ人々を念頭に置いていました。

于 2011-01-07T01:00:28.273 に答える
1

あなたは部分的に正しいです-repeat <stmts> until <expr>声明について。

複合ステートメントの一貫性のために BEGIN-END を必要としないのは少しごまかしのように感じますが、これは過度の苦痛を避けるためです。他のすべてのケースでわかるように、thenまたはelseまたはループdoが適用されるコードの部分を示すには、開始と終了のブラケット効果が必要です。REPEAT-UNTIL は、2 番目の部分を大幅に削除する必要があると私が考えることができる唯一の Pascal ステートメントです。別の形式は

UNTIL <condition> DO <statement>

UNTIL <condition> DO
  BEGIN
    <statements>
  END

しかし、ブロックが少なくとも 1 回実行されたにのみ条件がチェックされることを言語ユーザーに説明して説得するのは、あまりにも混乱を招きます。したがって、Wirth がこのようにしなかったのは良いことです。

に関してtry <stmts> except <stmts> end- これは元の Pascal 言語の設計と仕様によるものではありません。これは実装者 (Borland? FreePascal?) によって後から考え出されたものであり、一貫性がないのも不思議ではありません。全体的な仕様設計よりも「既存のプログラムを壊さずにできるか」というセリフ。言語拡張の別の例は、上記の回答に示されています-スイッチのデフォルト句else-caseこれは非常に便利で、Turbo Pascalの時代に使用されていましたが、これは構文elseでの使用とひどく矛盾しています. ifしたがって、私が見て、よりよく使用した別の実装を見つけます-その後に、それぞれの場合otherwise:のように単一のステートメントが続きます。<value>:

于 2011-02-04T00:24:46.910 に答える