La forma en que maneja el idioma ámbito léxico crea problemas con la inclusión de ambos goto
y continue
. Por ejemplo,
local a=0
repeat
if f() then
a=1 --change outer a
end
local a=f() -- inner a
until a==0 -- test inner a
La declaración de local a
dentro de las máscaras cuerpo del bucle la variable exterior nombra a
, y el alcance de que locales extiende a través de la condición de la declaración until
lo que la condición está probando el más interior a
.
Si existiera continue
, tendría que restringirse semánticamente para que solo sea válida después de que todas las variables utilizadas en la condición hayan entrado en el ámbito. Esta es una condición difícil de documentar para el usuario y hacer cumplir en el compilador. Se han discutido varias propuestas sobre este tema, incluida la respuesta simple de no permitir continue
con el estilo repeat ... until
del ciclo. Hasta ahora, ninguno ha tenido un caso de uso suficientemente convincente para incluirlos en el lenguaje.
La solución alternativa es invertir la condición que provocaría la ejecución de continue
, y recopilar el resto del cuerpo del bucle en esa condición. Por lo tanto, el siguiente bucle
-- not valid Lua 5.1 (or 5.2)
for k,v in pairs(t) do
if isstring(k) then continue end
-- do something to t[k] when k is not a string
end
podría escribirse
-- valid Lua 5.1 (or 5.2)
for k,v in pairs(t) do
if not isstring(k) then
-- do something to t[k] when k is not a string
end
end
Es bastante claro, y por lo general no una carga a menos que tenga una serie de sacrificios elaborados que controlan el funcionamiento del bucle.
Dado que se formuló esta pregunta, Lua obtuvo una declaración 'goto' que se puede usar para implementar continue. Vea las respuestas a continuación. – lhf