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