Bienvenidos sean a este post, un inconveniente de los iteradores vistos anteriormente es que debemos crear uno nuevo cierre para cada bucle, sin embargo para la mayoria de las situaciones no es un problema porque como hemos visto con el iterador palabrasTodas donde el costo de crear un cierre es insignificante comparado con el costo de leer un archivo pero en algunas situaciones esta sobrecarga puede ser un inconveniente, para estos casos vimos que existe el for generico para mantener el estado de iteracion, por eso en este post veremos las distintas facilidades que nos ofrece para mantener el estado.

Anuncios

Veamos primero su sintaxis como la hemos visto hasta ahora:

for <lista-variables> in <lista-expresion> do
	... instrucciones ...
end

En lista-variables sera uno o mas nombres de variables separados por comas y lista-expresion es una lista de una o mas expresiones tambien separadas por comas, aunque habitualmente la lista-expresion es un solo elemento el cual consiste en una llamada a la fabrica iteradora, veamos el siguiente ejemplo:

for k, v in pairs(t) do print(k, v) end

En este caso tenemos dos variables (k, v) en la lista-variables y en lista-expresiones tenemos una sola (t), como hemos visto en otros casos a menudo tambien la lista-variables tiene un solo elemento, veamos este otro ejemplo:

for linea in io.lines() do
	io.write(linea,"\n")
end

En este caso tenemos una variable llamada linea, conocida como variable de control, y en este caso la lista-expresion es el metodo lines del objeto io en el cuerpo tendremos una instruccion donde escribiremos por medio de write el contenido de linea y por medio de \n haremos el salto de linea.

Nota: La variable de control nunca tiene un valor nil mientras se ejecuta el bucle y lo obtiene cuando sale del mismo.

Hablemos sobre su mecanica, la primera cosa que hace el for es evaluar las expresiones despues del in, estas expresiones deberian resultar en los tres valores almacenados por el for:

  • La funcion iteradora
  • El estado invariable
  • El valor inicial para la variable de control
Anuncios

Como vimos en multiples asignaciones solo el ultimo (o el unico) elemento de la lista puede resultar en mas de un valor y el numero de valores esta sujeto a tres, valores extras son descartados o nils agregados segun sea necesario.

Nota: Cuando usamos iteradores simples, la fabrica devuelve solo la funcion del iterador, por esto el estado invariable y variable de control tienen un valor nil.

Despues de esta inicializacion, el for llama a la funcion iterator con dos argumentos:

  • El estado invariable
  • La variable de control

Luego el for asigna los valores regresados por la funcion del iterador a las variables declaradas por la lista-variable, si el primer valor regresado (el unico asignado a la variable de control) es nil, el bucle termina inmediatamente, de lo contrario el for ejecuta su cuerpo de instrucciones y llama a la funcion del iterador de nuevo, repitiendo el proceso.

Para ejemplificar el siguiente bucle for generico:

for var_1, ..., var_n in <lista-expresion> do <instrucciones> end

Equivaldria a este bloque:

do
	local _f, _s, _var = <lista-expresion>
	while true do
		local var_1, ..., var_n = _f(_s, _var)
		_var = _var_1
		if _var == nil then break end
		< instrucciones >
	end
end

En este caso tendremos la variable _f es nuestro iterador, la variable de control es _var y siempre que sea distinta de nil hara el loop y se le asignara un valor, y por ultimo la variable de estado es s, en definitiva los dos bloques hacen exactamente la misma tarea.

Anuncios

En resumen, hoy hemos visto un poco mas en profundidad el for generico, como trabaja, su sintaxis, algunas caracteristicas propias de la funcion, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00