Documentación de Celestia

 
  4. CELX SCRIPTS  
  4.5. Estructuras de control  
 

Las sentencias que componen un programa CELX se ejecutan de forma secuencial hasta llegar al final del programa. Pero en cualquier lenguaje de programación resulta interesante poder repetir varias veces la ejecución del mismo código o decidir durante la ejecución si algunas sentencias son ejecutadas. Para ello LUA proporciona las estructuras de control if, repeat, while y for similares a las usadas en otros lenguajes de programación. Para la construcción de estas estructuras se utilizan palabras reservadas, que son aquellas palabras que utiliza el lenguaje de programación para saber lo que se quiere hacer, por lo que estas palabras no pueden ser utilizadas como nombres de variables. A continuación se detalla como funciona cada una de ellas:

  • if: Esta estructura se utiliza para decidir en tiempo de ejecución si se ejecuta un bloque de líneas de código. También se puede utilizar para elegir entre dos caminos alternativo.

Su sintaxis es:

if exp then block {elseif exp then block} [else block] end

Exp hace referencia a una condición que se evalúa, de forma que si se cumple se ejecutara el bloque de sentencias block que tiene a continuación. Se pueden evaluar varias condiciones correspondientes a distintos caminos utilizando la palabra reservada elseif. También se puede especificar un bloque de sentencias a ejecutar cuando ninguna condición se cumpla, con la palabra reservada else. Tanto los bloques elseif como el bloque else son opcionales.

Para entender mejor esta estructura se puede ver el siguiente ejemplo de código, donde celestia:print sirve para mostrar un texto por pantalla:

if i == 1 then

celestia:print("La variable i tiene un valor 1")

elseif i == 2 then

celestia:print("La variable i tiene un valor 2")

else

celestia:print("La variable i tiene un valor distinto de 1 y de 2")

end

Si la variable i tiene un valor 1 cuando se empieza la ejecución de la estructura se mostrará el primer texto. Si tiene un valor 2 se mostrará el segundo texto y en cualquier otro caso se mostrará el último texto.

  • repeat: Esta estructura permite que se ejecute varias veces un bloque de sentencias de código, hasta que una condición se cumpla. Su sintaxis es:
repeat block until expExp es la condición que se evalúa, de forma que si se cumple se deja de repetir la ejecución del bloque de sentencias block. De cualquier manera, en esta construcción se ejecutará block al menos una vez.

A continuación de muestra un ejemplo del funcionamiento de esta estructura de control:

i = 1

repeat

celestia:print("La variable i tiene valor " .. i)

i = i +1

wait(2)

until i > 10

El programa irá mostrando los valores de la variable i desde 1 hasta 10, correspondientes a cada una de las repeticiones del bucle. Cuando a la variable se le asigna un valor 11 se termina de ejecutar el bucle.

  • while: Se trata de una estructura muy similar a la anterior, repitiéndose la ejecución de un bloque de sentencias mientras que una condición se cumpla. Pero en este caso la condición se evalúa antes del bloque de sentencias, por lo que es posible que el bloque no se ejecute ninguna vez. Su sintaxis es:

while exp do block end

Exp es la condición que se evalúa, de forma que si no se cumple se deja de repetir el bloque block.

El siguiente ejemplo ilustra el funcionamiento de esta estructura de repetición:

i = 1

while i < 10 do

celestia:print("La variable i tiene valor " .. i)

i = i +1

wait(2)

end

Este programa tiene una ejecución muy similar al del ejemplo anterior, ya que irá mostrando los valores de i desde 1 hasta 9, pero en este caso no se llegará a ejecutar el bloque de sentencias interno con un valor de i igual a 10 ya que dejará de cumplirse la condición que se evalúa al comienzo.

  • for: Esta estructura, que también sirve para realizar un bucle, es algo más compleja que las anteriores y tiene dos formas posibles. En la primera forma se especifica una variable con un valor inicial, una expresión que indica el límite de la variable y otra expresión que especifica como se va modificando la variable en cada una de las repeticiones. La variable del bucle puede ser usada dentro del mismo con el valor que va tomando en cada momento. Su sintaxis es:

for Name `=´ exp `,´ exp [`,´ exp] do block end

Name es el nombre de la variable del bucle a la que se le asigna una expresión que determinará su valor inicial, la segunda expresión indica el valor de la variable que pondrá fin a la ejecución del bucle y la tercera especifica el incremento que se hace en cada repetición del valor de la variable (si está vacía, la variable se incrementará 1 en cada repetición). Mientras no se alcance la condición de finalización, se repetirá la ejecución de las sentencias que conforman block.

El siguiente ejemplo muestra el uso de la construcción for en esta primera forma:

for i = 1 , 10, 1 do

celestia:print("La variable i tiene valor " .. i)

wait(2)

end

Este código repite la ejecución del bloque interno diez veces, tomando la variable i valores desde 1 hasta 10, incrementándose en cada repetición del bucle una unidad el valor de i.

La segunda forma utiliza una variable de tipo tabla. Se repite la ejecución un número de veces igual al número de elementos de la tabla, tomando las variables del bucle el valor de la clave y el contenido de uno de los elementos que componen la tabla, modificándose en cada repetición. Su sintaxis es:

for key,content inpairs(table) do block end

Table es la tabla sobre la que se itera, key la variable que toma el valor de la clave del elemento y value la que coge le valor del contenido. Se repetirá el bloque de sentencias block para cada uno de los elementos de la tabla.

El siguiente programa trata de mostrar el funcionamiento de esta segunda forma del bucle for:

t = {}

t["clave1"] = "valor1"

t["clave2"] = "valor2"

for clave, valor in pairs(t) do

celestia:print("El elemento " .. clave .. " tiene un valor " .. valor)

wait(2)

end

Las sentencias del bucle se ejecutarán dos veces, tomando la primera vez las variables clave y valor los valores “clave1” y “valor1” respectivamente, mientras que la segunda vez tendrán valores “clave1” y “valor1”.

 
 
Índice general