Euforia - Controle de Fluxo

O fluxo de execução do programa se refere à ordem em que as instruções do programa são executadas. Por padrão, as instruções são executadas uma após a outra.

Contudo; muitas vezes, a ordem de execução precisa ser alterada da ordem padrão para que a tarefa seja realizada.

O Euphoria tem várias instruções de controle de fluxo que você pode usar para organizar a ordem de execução das instruções.

A declaração de saída

A saída de um loop é feita com a palavra-chave exit. Isso faz com que o fluxo saia imediatamente do loop atual e recomece com a primeira instrução após o final do loop.

Sintaxe

A sintaxe de uma instrução de saída é a seguinte -

exit [ "Label Name" ] [Number]

o exit instrução termina o loop mais recente e interno até que um nome ou número de rótulo opcional seja especificado.

Uma forma especial de exit N é exit 0. Isso deixa todos os níveis de loop, independentemente da profundidade. O controle continua após o bloco de loop mais externo. Da mesma forma, a saída -1 sai do segundo loop mais externo e assim por diante.

Exemplo

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

Isso produz o seguinte resultado -

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

A declaração de pausa

o break declaração funciona exatamente como o exit , mas se aplica a instruções if ou instruções switch em vez de instruções de loop de qualquer tipo.

Sintaxe

A sintaxe da instrução break é a seguinte -

break [ "Label Name" ] [Number]

o break A instrução termina o bloco if ou switch mais recente e interno até que um nome ou número de rótulo opcional seja especificado.

Uma forma especial de break N é break 0. Isso deixa o bloco if ou switch mais externo, independentemente da profundidade. O controle continua após o bloco mais externo. Da mesma forma, break -1 quebra o segundo bloco mais externo if ou switch e assim por diante.

Exemplo

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

Isso produz o seguinte resultado -

value of a 3
value of b 1

A declaração continue

o continue A instrução continua a execução do loop ao qual se aplica indo para a próxima iteração e pulando o resto de uma iteração.

Ir para a próxima iteração significa testar um índice de variável de condição e verificar se ele ainda está dentro dos limites.

Sintaxe

A sintaxe da instrução continue é a seguinte -

continue [ "Label Name" ] [Number]

o continue instrução iria reiterar o loop mais recente e interno até que um nome ou número de rótulo opcional seja especificado.

Uma forma especial de continue N é continue 0. Isso reitera o loop mais externo, independentemente da profundidade. Da mesma forma, continue -1 começa a partir do segundo loop mais externo e assim por diante.

Exemplo

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

A instrução de nova tentativa

o retry A instrução continua a execução do loop ao qual se aplica indo para a próxima iteração e pulando o resto de uma iteração.

Sintaxe

A sintaxe da instrução de nova tentativa é a seguinte -

retry [ "Label Name" ] [Number]

o retryinstrução tenta novamente executar a iteração atual do loop ao qual se aplica. A instrução desvia para a primeira instrução do loop designado, sem testar nada nem incrementar o índice do loop for.

Uma forma especial de retry N é retry 0. Isso tenta novamente executar o loop mais externo, independentemente da profundidade. Da mesma forma, repetir -1 tenta novamente o segundo loop externo e assim por diante.

Normalmente, um sub-bloco que contém uma instrução de repetição também contém outra palavra-chave de controle de fluxo como sair, continuar ou interromper. Caso contrário, a iteração seria executada indefinidamente.

Exemplo

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

Como a nova tentativa não altera o valor de i e tenta abrir novamente o mesmo arquivo, deve haver uma maneira de interromper o loop, fornecida pela instrução de saída.

A declaração goto

o goto instrução instrui o computador a retomar a execução do código em um local rotulado.

O local para retomar a execução é chamado de destino da instrução. É restrito a estar na rotina atual ou no arquivo atual se estiver fora de qualquer rotina.

Sintaxe

A sintaxe da instrução goto é a seguinte -

goto "Label Name"

O destino de uma instrução goto pode ser qualquer acessível label declaração -

label "Label Name"

Os nomes dos rótulos devem ser strings constantes entre aspas. Os caracteres que são ilegais em identificadores de Euphoria podem aparecer em um nome de rótulo, uma vez que é uma string regular.

Exemplo

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

Isso produz o seguinte resultado -

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