Euforia - Controllo del flusso

Il flusso di esecuzione del programma si riferisce all'ordine in cui vengono eseguite le istruzioni del programma. Per impostazione predefinita, le istruzioni vengono eseguite una dopo l'altra.

Però; molte volte l'ordine di esecuzione deve essere modificato dall'ordine predefinito, per portare a termine l'attività.

Euphoria ha una serie di istruzioni di controllo del flusso che puoi utilizzare per organizzare l'ordine di esecuzione delle istruzioni.

La dichiarazione di uscita

L'uscita da un ciclo viene eseguita con la parola chiave exit. Ciò fa sì che il flusso lasci immediatamente il ciclo corrente e ricominci con la prima istruzione dopo la fine del ciclo.

Sintassi

La sintassi di un'istruzione exit è la seguente:

exit [ "Label Name" ] [Number]

Il exit L'istruzione termina il ciclo più recente e più interno finché non viene specificato un nome o un numero di etichetta opzionale.

Una forma speciale di exit N è exit 0. Questo lascia tutti i livelli di loop, indipendentemente dalla profondità. Il controllo continua dopo il blocco del loop più esterno. Allo stesso modo, exit -1 esce dal secondo ciclo più esterno e così via.

Esempio

#!/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)

Questo produce il seguente risultato:

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

La dichiarazione di rottura

Il break l'istruzione funziona esattamente come l'istruzione exit istruzione, ma si applica a istruzioni if ​​o switch piuttosto che a istruzioni loop di qualsiasi tipo.

Sintassi

La sintassi dell'istruzione break è la seguente:

break [ "Label Name" ] [Number]

Il break L'istruzione termina il blocco if o switch più recente e più interno finché non viene specificato un nome o un numero di etichetta opzionale.

Una forma speciale di break N è break 0. Questo lascia il blocco più esterno if o switch, indipendentemente dalla profondità. Il controllo continua dopo il blocco più esterno. Allo stesso modo, break -1 rompe il secondo blocco if o switch più esterno, e così via.

Esempio

#!/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)

Questo produce il seguente risultato:

value of a 3
value of b 1

L' istruzione continue

Il continue continua l'esecuzione del ciclo a cui si applica passando all'iterazione successiva e saltando il resto di un'iterazione.

Passare all'iterazione successiva significa testare un indice di una variabile di condizione e verificare se è ancora entro i limiti.

Sintassi

La sintassi dell'istruzione continue è la seguente:

continue [ "Label Name" ] [Number]

Il continue l'istruzione ripeterebbe il ciclo più recente e più interno fino a quando non viene specificato un nome o un numero di etichetta opzionale.

Una forma speciale di continue N è continue 0. Questo ripete il ciclo più esterno, indipendentemente dalla profondità. Allo stesso modo, continue -1 inizia dal secondo ciclo più esterno e così via.

Esempio

#!/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' istruzione retry

Il retry continua l'esecuzione del ciclo a cui si applica passando all'iterazione successiva e saltando il resto di un'iterazione.

Sintassi

La sintassi dell'istruzione retry è la seguente:

retry [ "Label Name" ] [Number]

Il retryl'istruzione riprova eseguendo l'iterazione corrente del ciclo a cui si applica. L'istruzione si dirama alla prima istruzione del ciclo designato né testando nulla né incrementando l'indice del ciclo for.

Una forma speciale di retry N è retry 0. Questo riprova a eseguire il ciclo più esterno, indipendentemente dalla profondità. Allo stesso modo, riprova -1 riprova il secondo ciclo più esterno e così via.

Normalmente, un sottoblocco che contiene un'istruzione retry contiene anche un'altra parola chiave per il controllo del flusso come exit, continue o break. Altrimenti, l'iterazione verrebbe eseguita all'infinito.

Esempio

#!/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

Poiché retry non cambia il valore di i e riprova ad aprire lo stesso file, deve esserci un modo per interrompere il ciclo, fornito dall'istruzione exit.

L'istruzione goto

Il goto istruzione indica al computer di riprendere l'esecuzione del codice in un punto etichettato.

Il luogo in cui riprendere l'esecuzione è chiamato obiettivo dell'istruzione. È limitato a trovarsi nella routine corrente o nel file corrente se al di fuori di qualsiasi routine.

Sintassi

La sintassi dell'istruzione goto è la seguente:

goto "Label Name"

La destinazione di un'istruzione goto può essere qualsiasi accessibile label dichiarazione -

label "Label Name"

I nomi delle etichette devono essere stringhe costanti tra virgolette. I caratteri che sono illegali negli identificatori di Euphoria possono apparire nel nome di un'etichetta, poiché è una stringa normale.

Esempio

#!/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)

Questo produce il seguente risultato:

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