Euphoria - Contrôle de flux

Le flux d'exécution du programme fait référence à l'ordre dans lequel les instructions du programme sont exécutées. Par défaut, les instructions sont exécutées les unes après les autres.

Pourtant; plusieurs fois, l'ordre d'exécution doit être modifié par rapport à l'ordre par défaut pour que la tâche soit exécutée.

Euphoria possède un certain nombre d' instructions de contrôle de flux que vous pouvez utiliser pour organiser l'ordre d'exécution des instructions.

La déclaration de sortie

La sortie d'une boucle se fait avec le mot-clé exit. Cela fait que le flux quitte immédiatement la boucle en cours et recommence avec la première instruction après la fin de la boucle.

Syntaxe

La syntaxe d'une instruction de sortie est la suivante -

exit [ "Label Name" ] [Number]

le exit L'instruction met fin à la dernière boucle la plus interne jusqu'à ce qu'un nom ou un numéro d'étiquette facultatif soit spécifié.

Une forme spéciale de exit N est exit 0. Cela laisse tous les niveaux de boucle, quelle que soit la profondeur. Le contrôle continue après le bloc de boucle le plus à l'extérieur. De même, exit -1 sort de la deuxième boucle la plus externe, et ainsi de suite.

Exemple

#!/home/euphoria-4.0b2/bin/eui

integer b

for a = 1 to 16 do
   printf(1, "value of a %d\n", a)
   
   if a = 10 then
      b = a
      exit
   end if
end for

printf(1, "value of b %d\n", b)

Cela produit le résultat suivant -

value of a 1
value of a 2
value of a 3
value of a 4
value of a 5
value of a 6
value of a 7
value of a 8
value of a 9
value of a 10
value of b 10

L' instruction break

le break L'instruction fonctionne exactement comme la exit instruction, mais s'applique aux instructions if ou switch plutôt qu'aux instructions en boucle de tout type.

Syntaxe

La syntaxe de l'instruction break est la suivante -

break [ "Label Name" ] [Number]

le break L'instruction termine le dernier bloc if ou switch jusqu'à ce qu'un nom ou un numéro d'étiquette facultatif soit spécifié.

Une forme spéciale de break N est break 0. Cela laisse le bloc de commutation le plus externe, quelle que soit la profondeur. Le contrôle continue après le bloc le plus à l'extérieur. De même, break -1 rompt le deuxième bloc if ou switch le plus externe, et ainsi de suite.

Exemple

#!/home/euphoria-4.0b2/bin/eui

integer a, b
sequence s = {'E','u', 'p'}

if s[1] = 'E' then
   a = 3
   
   if s[2] = 'u' then
      b = 1
      if s[3] = 'p' then
         break 0 -- leave topmost if block
      end if
      a = 2
   else
      b = 4
   end if
else
   a = 0
   b = 0
end if

printf(1, "value of a %d\n", a)
printf(1, "value of b %d\n", b)

Cela produit le résultat suivant -

value of a 3
value of b 1

La déclaration continue

le continue L'instruction continue l'exécution de la boucle à laquelle elle s'applique en passant à l'itération suivante et en ignorant le reste d'une itération.

Passer à l'itération suivante signifie tester un index de variable de condition et vérifier s'il est toujours dans les limites.

Syntaxe

La syntaxe de l'instruction continue est la suivante -

continue [ "Label Name" ] [Number]

le continue L'instruction réitérerait la dernière boucle la plus interne jusqu'à ce qu'un nom ou un numéro d'étiquette facultatif soit spécifié.

Une forme spéciale de continue N est continue 0. Cela réitère la boucle la plus externe, quelle que soit la profondeur. De même, continue -1 commence à partir de la deuxième boucle la plus externe, et ainsi de suite.

Exemple

#!/home/euphoria-4.0b2/bin/eui

for a = 3 to 6 do
   printf(1, "value of a %d\n", a)

   if a = 4 then
      puts(1,"(2)\n")
      continue
   end if

   printf(1, "value of a %d\n", a*a)
end for
This would produce following result:

value of a 3
value of a 9
value of a 4
(2)
value of a 5
value of a 25
value of a 6
value of a 36

L' instruction retry

le retry L'instruction continue l'exécution de la boucle à laquelle elle s'applique en passant à l'itération suivante et en ignorant le reste d'une itération.

Syntaxe

La syntaxe de l'instruction retry est la suivante -

retry [ "Label Name" ] [Number]

le retryL'instruction essaie d'exécuter l'itération actuelle de la boucle à laquelle elle s'applique. L'instruction se ramifie à la première instruction de la boucle désignée sans rien tester ni incrémenter l'index de la boucle for.

Une forme spéciale de retry N est retry 0. Cela tente d'exécuter la boucle la plus externe, quelle que soit la profondeur. De même, retry -1 retentit la deuxième boucle la plus externe, et ainsi de suite.

Normalement, un sous-bloc qui contient une instruction de relance contient également un autre mot clé de contrôle de flux comme exit, continue ou break. Sinon, l'itération serait exécutée à l'infini.

Exemple

#!/home/euphoria-4.0b2/bin/eui

integer errors = 0
integer files_to_open = 10

for i = 1 to length(files_to_open) do
   fh = open(files_to_open[i], "rb")
   
   if fh = -1 then
      if errors > 5 then
         exit
      else
         errors += 1
         retry
      end if
   end if
   file_handles[i] = fh
end for

Étant donné que retry ne change pas la valeur de i et essaie à nouveau d'ouvrir le même fichier, il doit y avoir un moyen de rompre la boucle, ce que fournit l'instruction exit.

La déclaration goto

le goto l'instruction demande à l'ordinateur de reprendre l'exécution du code à un endroit étiqueté.

L'endroit où reprendre l'exécution est appelé la cible de l'instruction. Il est limité à se trouver dans la routine actuelle, ou dans le fichier courant s'il est en dehors de toute routine.

Syntaxe

La syntaxe de l'instruction goto est la suivante -

goto "Label Name"

La cible d'une instruction goto peut être toute accessible label déclaration -

label "Label Name"

Les noms d'étiquette doivent être des chaînes constantes entre guillemets. Les caractères qui ne sont pas autorisés dans les identificateurs Euphoria peuvent apparaître dans un nom d'étiquette, car il s'agit d'une chaîne régulière.

Exemple

#!/home/euphoria-4.0b2/bin/eui

integer a = 0

label "FIRST"
printf(1, "value of a %d\n", a)
a += 10

if a < 50 then
   goto "FIRST"
end if 
printf(1, "Final value of a %d\n", a)

Cela produit le résultat suivant -

value of a 0
value of a 10
value of a 20
value of a 30
value of a 40
Final value of a 50