Euphoria - Control de flujo

El flujo de ejecución del programa se refiere al orden en que se ejecutan las sentencias del programa. De forma predeterminada, las declaraciones se ejecutan una tras otra.

Sin embargo; muchas veces es necesario modificar el orden de ejecución del orden predeterminado para realizar la tarea.

Euphoria tiene una serie de declaraciones de control de flujo que puede utilizar para organizar el orden de ejecución de las declaraciones.

La declaración de salida

La salida de un bucle se realiza con la palabra clave exit. Esto hace que el flujo abandone inmediatamente el ciclo actual y vuelva a comenzar con la primera declaración después del final del ciclo.

Sintaxis

La sintaxis de una declaración de salida es la siguiente:

exit [ "Label Name" ] [Number]

los exit sentencia termina el último y más interno bucle hasta que se especifica un nombre o número de etiqueta opcional.

Una forma especial de exit N es exit 0. Esto deja todos los niveles de bucle, independientemente de la profundidad. El control continúa después del bloque de bucle más externo. Del mismo modo, la salida -1 sale del segundo bucle más externo, y así sucesivamente.

Ejemplo

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

Esto produce el siguiente 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

La declaración de ruptura

los break declaración funciona exactamente como el exit declaración, pero se aplica a declaraciones if o declaraciones switch en lugar de declaraciones de bucle de cualquier tipo.

Sintaxis

La sintaxis de la instrucción break es la siguiente:

break [ "Label Name" ] [Number]

los break sentencia termina el último y más interno bloque if o switch hasta que se especifica un nombre o número de etiqueta opcional.

Una forma especial de break N es break 0. Esto deja el bloque más externo if o switch, independientemente de la profundidad. El control continúa después del bloque más externo. Del mismo modo, break -1 rompe el segundo bloque if o switch más externo, y así sucesivamente.

Ejemplo

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

Esto produce el siguiente resultado:

value of a 3
value of b 1

La declaración de continuar

los continue La instrucción continúa la ejecución del bucle al que se aplica yendo a la siguiente iteración y omitiendo el resto de una iteración.

Pasar a la siguiente iteración significa probar un índice de variable de condición y verificar si todavía está dentro de los límites.

Sintaxis

La sintaxis de la instrucción continue es la siguiente:

continue [ "Label Name" ] [Number]

los continue La declaración repetiría el ciclo más reciente e interno hasta que se especifique un nombre o número de etiqueta opcional.

Una forma especial de continue N es continue 0. Esto repite el bucle más externo, independientemente de la profundidad. Del mismo modo, continue -1 comienza desde el segundo bucle más externo, y así sucesivamente.

Ejemplo

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

La declaración de reintento

los retry La instrucción continúa la ejecución del bucle al que se aplica yendo a la siguiente iteración y omitiendo el resto de una iteración.

Sintaxis

La sintaxis de la declaración de reintento es la siguiente:

retry [ "Label Name" ] [Number]

los retryinstrucción reintenta ejecutar la iteración actual del bucle al que se aplica. La declaración se ramifica a la primera declaración del bucle designado sin probar nada ni incrementar el índice del bucle for.

Una forma especial de retry N es retry 0. Esto vuelve a intentar ejecutar el bucle más externo, independientemente de la profundidad. Del mismo modo, reintentar -1 reintenta el segundo bucle más externo, y así sucesivamente.

Normalmente, un subbloque que contiene una declaración de reintento también contiene otra palabra clave de control de flujo como salir, continuar o romper. De lo contrario, la iteración se ejecutaría sin cesar.

Ejemplo

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

Dado que reintentar no cambia el valor de iy vuelve a intentar abrir el mismo archivo, tiene que haber una forma de romper con el ciclo, que proporciona la declaración de salida.

La declaración de goto

los goto instrucción indica a la computadora que reanude la ejecución del código en un lugar etiquetado.

El lugar para reanudar la ejecución se denomina destino de la declaración. Está restringido a estar en la rutina actual, o en el archivo actual si está fuera de alguna rutina.

Sintaxis

La sintaxis de la instrucción goto es la siguiente:

goto "Label Name"

El destino de una declaración goto puede ser accesible label declaración -

label "Label Name"

Los nombres de las etiquetas deben ser cadenas constantes entre comillas dobles. Los caracteres que son ilegales en los identificadores de Euphoria pueden aparecer en el nombre de una etiqueta, ya que es una cadena normal.

Ejemplo

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

Esto produce el siguiente 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