Question

La plupart des structures de contrôle Pascal me sens pour, comme:

for ... do {statement};

if (condition) then {statement};

while (condition) do {statement};

où la {déclaration} est une instruction unique, ou commencer ... end bloc. J'ai un problème avec:

repeat {statement-list} until (expression);

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

Ce ne serait pas mieux que répétition et essayer ont la même structure générale, acceptant seulement une seule déclaration ou commencer .. . end bloc, au lieu d'avoir une liste d'instructions qui n'est pas formellement bloqué avec un commencer et end ?

Était-ce utile?

La solution

Les formes qui exigent un début / fin existons tous sur une seule ligne - le compilateur n'a pas d'autre moyen de savoir où les extrémités de bloc. Les formes qui ne nécessitent pas un début / fin ont une structure de fermeture qui indique au compilateur où elle se termine et donc le début / fin serait tout simplement inutile. Vous êtes libre d'utiliser dans ce cas, si vous voulez, bien.

Autres conseils

Niklaus Wirth (le concepteur de Pascal) a corrigé ces incohérences dans sa prochaine langue, Modula-2 . Dans Modula-2, les déclarations composées comme IF ont pas BEGIN et END obligatoire:

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

D'autres structures de contrôle telles que WHILE sont similaires et compatibles avec REPEAT.

La question est: ne serait-il mieux

La réponse est: Cela dépend, comme ce genre de chose est tout à fait subjective. À moins que vous êtes, ou pensez comme une machine.

Oui, il satisferait une certaine douleur pour la cohérence d'appliquer début / fin pour TOUTES les déclarations de composés, mais où les éléments de langage qui entourent offrent déjà une enceinte naturelle, il est tout à fait superflu d'exiger.

Considérez l'instruction CASE:

// "Sensible" syntax

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

par rapport à une moins sensible mais plus cohérente et "logique":

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

Notez que la finale « fin » fait partie du « cas ». Vous ne pouvez pas faire sans elle.

Je suis assez sûr que, dans une première version de Chrome (qui est devenu par la suite Oxygene et Prism) ce qui était effectivement nécessaire syntaxe de l'instruction de cas. Si oui, il n'est plus le cas. Le bon sens a prévalu sans doute.

A mon avis, la satisfaction OGoSC (Dieux Objectif de cohérence Syntactic) met en colère le peut-être moins, mais en fait plus pertinent pour vous et moi, SGoHRaC (Dieux de Subjective Lisibilité et l'intelligence humaine).

Bien que dans de nombreux cas, il peut apparaître autrement, nous ne sommes pas humains dans les machines de fait. On n'a pas besoin de simplifier et de réduire les règles à un ensemble minimum cohérent pour permettre au texte et analyse syntaxique du sens de celui-ci. Nous avons besoin de règles, mais nous pouvons gérer plus, puisque notre grand avantage sur les machines est une liberté de pensée qui nous libère d'un régime strict de la syntaxe et de la structure, en particulier lorsque cette syntaxe et la structure est étrangère au point de redondance.

Comme dans ce cas.

Si vous faites une erreur que le compilateur ne peut pas interpréter, il vous dira, chaque fois que vous compilez. Mais le compilateur ne vous remerciera pas pour rendre le code plus « facile » à « lire » (le compilateur suit simplement les règles qu'il est donné - il ne rend pas « plus facile » pour le compilateur de « lire » le code en changeant la règles qu'il peut déjà suivre parfaitement heureusement).

Si vous imposez des règles arbitraires qui le rendent plus difficile à lire (non pas parce que les règles sont plus ou moins invariant / cohérente, mais parce que vous imposez une structure cohérente qui lui-même contient des informations plus de bruit et redondant qui doit être filtré) alors vous paiera le prix de la productivité humaine.

En fait, ces « règles plus faciles » plus « compatibles », peut peut effectivement rendre plus difficile tout autour ... Reprenons l'instruction CASE.

Pour faire ce composé début / fin de sens de faire, il faut faire « cas » une déclaration autonome, ne fait pas partie d'une paire cas / fin, donc TOUS ces éléments doivent être une syntaxe valide:

  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;

Vous pouvez en désaccord, mais il me semble que tout à coup ce résultat de syntaxe plus cohérente en fait dans la cohérence MOINS dans le code actuel, bien qu'il y ait une plus grande cohérence dans les règles que le code est en cours d'écriture pour se conformer à.

Probablement. Mais la conception du langage, en particulier les langues avec un peu d'histoire, est rarement simple ou idéal.

Vous pouvez voir des choses semblables dans d'autres langues. Java, par exemple, nécessite un bloc après try et ne permettra pas une seule déclaration, même si une seule déclaration pourrait aussi si vous regardez d'autres structures de contrôle.

Pourquoi est-switch en C et langues dérivées d'un seul bloc et les cas individuels non?

Il a à voir avec la façon dont fonctionne l'analyseur. Début / fin, essayez / sauf et répéter / jusqu'à ce que tous contiennent des blocs d'instructions. Le code de l'analyseur ressemble de quelque chose comme ça, pour un bloc début (pseudo-code):

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

Et ça fonctionne bien pour ce type de bloc. Mais quand vous avez besoin d'informations supplémentaires sur la ligne de fin de bloc (une condition pour la répétition / jusqu'à ce que, et un bloc de gestion des exceptions pour l'essai), alors vous ne voulez pas tourner jusqu'à ce que fin , qui les attend de grammaire de la langue pour ne pas avoir quoi que ce soit après. Vous pouvez modifier la grammaire, mais qui ajouterait beaucoup de complexité à l'analyseur. Ainsi, au lieu que vous venez de choisir un autre mot-clé.

Je suppose que vous posez la mauvaise question. Je veux dire, peut-être vous ne voyez pas la différence entre le si / alors / pour le groupe et le groupe répétition / essayer.

Le premier groupe a besoin de quelque chose (condition ou arguments) pour commencer quelque chose. Le second, au contraire, implique de BEGIN quelque chose. Il suffit de lire les mots:. Répéter (suivant) et essayer (ce qui suit)

Pascal est propre, simple et élégant, car il est conçu pour les lecteurs de l'homme ordinaire, le professeur Wirth avait à l'esprit les programmes d'apprentissage quand il a conçu.

Vous êtes en partie correcte - sur la déclaration de repeat <stmts> until <expr>.

Il se sent un peu d'un tricheur que vous n'avez pas besoin BEGIN-END pour la cohérence de l'instruction, mais ce composé est d'éviter des souffrances inutiles. Parce que vous voyez dans tous les autres cas, vous devez commencer la fin de bracketing effet pour montrer où la partie du code auquel then ou else ou boucles do à appliquer. Repeat-until est la seule déclaration Pascal que je peux penser qui nécessite une deuxième partie très éloignée - car il est logique la condition pour la sortie de boucle pour être textuellement où il sera vérifié - après le corps de la boucle . Une autre forme aurait pu être

UNTIL <condition> DO <statement>

UNTIL <condition> DO
  BEGIN
    <statements>
  END

mais il serait trop déroutant pour expliquer et convaincre les utilisateurs de la langue que la condition ne sera vérifiée que après le bloc est exécuté au moins une fois. Il est donc une bonne chose Wirth n'a pas fait de cette façon.

En ce qui concerne try <stmts> except <stmts> end - (? Borland FreePascal) ce n'est pas de la conception du langage Pascal original et cahier des charges, ce qui a été giflé comme après-pensée par certains implementor, il est donc pas étonnant qu'il est incompatible - la pensée a été plus aux lignes de « je peux le faire sans casser les programmes existants » que la conception globale du cahier des charges. Un autre exemple de l'extension de la langue a été donné en réponse ci-dessus - la else clause par défaut dans le commutateur de case - et alors que je trouve cela très utile et avait utilisé à l'époque de Turbo Pascal - c'est horriblement incompatible avec l'utilisation de else dans la if construction. Ainsi, je trouve une autre implémentation je l'ai vu et utilisé mieux -. otherwise: suivie d'une seule déclaration dans chaque cas <value>:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top