You are on page 1of 38

Conceptos Importantes De Un Script

El Script Es Global El motor de Script es global en el ambiente de tiempo de ejecucin. Esto significa que todos los eventos sabrn acerca de otras variables y funciones declaradas en alguna otra parte del producto. Por ejemplo, si asignas myvar = 10; en el evento On Startup del proyecto, myvar an ser igual a 10 cuando el prximo evento d inicio. Hay mtodos en torno a esta modalidad global (ver Variable Scope), pero estn por lo general alineados al motor del Script. El Script Es Sensible A Las Maysculas-Minsculas El motor de Script es sensible a las maysculas-minsculas. Esto significa que los caracteres en mayscula y minscula son importantes para tpicos como contraseas, nombres de variables y nombres de funciones. Por ejemplo: ABC = 10; aBC = 7; En el script de arriba, ABC y aBC se refieren a dos variables distintas, y pueden tener diferentes valores. La letra minscula a en aBC la hace completamente diferente de ABC en cuanto le concierne. El mismo principio tambin se aplica a los nombres de funcin. Por ejemplo: Dialog.Message("Qu tal", "Hola Mundo"); ...se refiere a una funcin. Sin embargo, DIALOG.Message("Qu tal", "Hola Mundo "); ...no ser reconocida como una funcin integrada, debido a que DIALOG y Dialog son vistos como dos nombres completamente diferentes. Nota: Es completamente posible tener dos funciones con las mismas letras pero diferentes en maysculas-minsculas; por ejemplo: GreetUser y gREeTUSeR sern vistas como dos funciones totalmente diferentes. Aunque es absolutamente posible que tales funciones coexistan, generalmente es mejor darle a las funciones nombres completamente diferentes para evitar cualquier confusin.

Comentarios
Se pueden insertar comentarios no ejecutables dentro de tus scripts para explicar y documentar tu cdigo. En un script, cualquier texto despus de dos guiones (--) en una lnea ser ignorado. Por ejemplo: -- Asignar 10 a la variable abc abc = 10;

...o: abc = 10; -- Asignar 10 a abc Los dos ejemplos de arriba hacen exactamente la misma cosa, los comentarios no afectan al script de ningn modo. Tambin puedes crear comentarios multilnea usando --[[ and ]]al inicio y al final del comentario: --[[ Este es un comentario multilnea ]]-a = 10; Te sugerimos usar comentarios para explicar tus scripts tanto como sea posible para hacerlos ms fciles de entender por ti mismo y por otros.

Delimitando Oraciones
Cada nica oracin puede estar ya sea en su propia lnea y/o separada por un punto y coma (;). Por ejemplo, todos los scripts siguientes son vlidos: Script 1: a = 10 MyVar = a Script 2: a = 10; MyVar = a; Script 3: a = 10; MyVar = a; Sin embargo, te recomendamos que finalices todas las oraciones con un punto y coma (como en los scripts 2 y 3 de arriba).

VARIABLES
Qu son las Variables? Las variables son muy importantes en el Script de Autoplay. Las variables son simplemente apodos o contenedores para valores que podran necesitar modificarse o reutilizarse despus. Por ejemplo, el siguiente script asigna el valor 10 a la variable llamada cantidad cantidad = 10; Nota: Decimos que los valores son asignados a o almacenados en variables. Si describes una variable como un contenedor que contiene un valor, asignar un valor a una variable es como colocar ese valor dentro del contenedor. Puedes cambiar este valor en cualquier momento asignndole un valor diferente a la variable; el nuevo valor simplemente reemplazar al anterior. Esta habilidad para contener informacin cambiable es lo que hace a las variables tan tiles. Aqu te proporcionamos un par de ejemplos demostrando cmo puedes operar sobre la variable cantidad

cantidad = 10; cantidad = cantidad + 20; Dialog.Message("Valor", cantidad); Esto almacena 10 en la variable llamada cantidad, luego aade 20 a ese valor, y finalmente hace que un cuadro de dilogo aparezca con el valor actual (el cual es ahora el nmero 30) en l. Tambin puedes asignar una variable a otra: a = 10; b = a; Dialog.Message("Valor", b); Esto har que un cuadro de dilogo aparezca con el nmero 10 en l. La lnea b = a; le asigna el valor de a (el cual es 10) a b.

Campo De Accin De Las Variables


Como se haba mencionado antes, todas las variables en AutoPlay Media Studio son globales por defecto. Esto significa justamente que existen en todo el proyecto, y mantienen sus valores desde un script al siguiente. En otras palabras, si un valor es asignado a una variable en un script, la variable mantendr an ese valor cuando el siguiente script sea ejecutado. Por ejemplo, si introduces el siguiente script: foo = 10; dentro del evento On Open de la pgina actual, y luego introduces: Dialog.Message("El valor es:", foo); dentro del evento On Click de un objeto de botn, el segundo script utilizar el valor que le fue asignado a foo en el primer script. Como resultado, cuando el objeto de botn es clickeado, un cuadro de dilogo aparecer con el nmero 10 en l. Date cuenta que el orden de ejecucin es importante para que un script sea capaz de usar el valor que le fue asignado a la variable en otro script, ese otro script tiene que ser ejecutado primero. En el ejemplo de arriba, el evento On Open de la pgina es accionado antes que el evento On Click del botn, as que el valor 10 ya est asignado a foo cuando el script del evento On Click es ejecutado.

Variables Locales
La naturaleza global del motor del Script significa que una variable retiene su valor a lo largo y ancho de todo tu proyecto. Puedes, sin embargo, hacer variables que sean no-globales usando la palabra clave especial local. Poner la palabra local antes de una variable asignada crea una variable que es local en el script o funcin actual. Por ejemplo, digamos que tienes los siguientes tres scripts en el mismo proyecto: Script 1: -- asigna 10 a x x = 10;

Script 2: local x = 500; Dialog.Message("El valor local de x es:", x); x = 250; -- esto cambia la x local, no la global Dialog.Message("El valor local de x es:", x); Script 3: -- muestra el valor global de x Dialog.Message("El valor global de x es:", x); Asumamos que estos tres scripts son ejecutados uno despus de otro. El primer script le da a x el valor de 10. Puesto que todas las variables son globales por defecto, x tendr este valor dentro de todos los otros scripts tambin. El segundo script hace una asignacin local para x, dndole el valor de 500 (pero slo dentro de ese script). Si alguna otra cosa dentro de ese script quiere acceder al valor de x, ver el valor local en lugar del global. Es como si la variable x fuera temporalmente reemplazada por otra variable que luce como sta, pero tiene un valor distinto. (Esto nos recuerda aquellas pelculas donde los ladrones del banco ponen una fotografa enfrente de las cmaras de seguridad de modo que los guardias no vean que la bveda est siendo vaciada. Slo en este caso, es como los ladrones del banco crean una intacta bveda nueva en operacin, como la original, y entonces la desmantelan y luego huyen tranquilamente) Cuando se manda mostrar el contenido de x, la primera accin interna Dialog.Message del script #2 mostrar 500, puesto que es el valor local de x cuando la accin es ejecutada. La prxima lnea le asigna 250 al valor local de x (date cuenta que una vez que haces una variable local, sta reemplaza completamente a la variable global por el resto del script). Finalmente, la tercera parte del script muestra el valor global de x, el cual es an 10. Nota: Para que se muestren los cuadros de dilogo como se describe arriba, debers introducir el Script #3 en un evento diferente al del Script #2

Nominacin de Variables
Los nombres de las variables pueden ser inventados de cualquier combinacin de letras, dgitos y subrayados, siempre y cuando no comiencen con un nmero y no entren en conflicto con palabras clave reservadas. Ejemplos vlidos para nombres de variables: a strName _My_Variable data1 data_1_23 index bReset nCount Ejemplos no vlidos para nombres de variables: 1 1data %MyValue% $strData

for local _FirstName+LastName_ User Name Clido (no son vlidas palabras con acento, diresis, ni caracteres especiales)

Palabras Clave Reservadas


Las siguientes palabras estn reservadas y no pueden ser utilizadas para nombres de variables o de funciones: and end in repeat until Tipos y Valores El lenguaje de Script de este tutorial es dinmicamente escrito. No hay definiciones de tipo (ms bien, cada valor lleva su propio tipo). Esto significa que no tienes que declarar que una variable sea de cierto tipo antes de usarla. Por ejemplo, en C++, si quieres usar un nmero, primero tienes que declarar el tipo de variable y luego asignarle un valor: int j; j = 10; El ejemplo C++ de arriba declara a j como un entero, y luego le asigna un valor de 10. Como hemos visto, puedes simplemente asignarle un valor a una variable sin declarar su tipo. Las variables realmente no tienen tipos; por el contrario, es el valor interno de ellas lo que hace que sean consideradas un tipo u otro. Por ejemplo: j = 10; esto crea automticamente la variable llamada j y le asigna el valor de 10. Aunque este valor tiene un tipo (un nmero), la variable en s misma es an sin tipo. Esto significa que puedes regresar y asignarle un tipo diferente de valor a j, como esto: j = "Hello"; Esto reemplaza al nmero 10 que es almacenado en j con la cadena Hello. El hecho de que una cadena sea un tipo diferente de valor no importa; a la variable j no le importa qu tipo de valor soporta, ella slo almacena lo que t le asignas. Hay seis tipos bsicos de datos en Este Tutorial: number (nmero), string (cadena), nil (nulo), boolean (booleano), function (funcin) y table (tabla). Las secciones de abajo te explicarn cada tipo de datos con ms detalle. break false local return while do for nil table else function not then elseif If or true

Number (Nmero)
Un nmero es exactamente eso: un valor numrico. El tipo de nmero representa nmeros reales, especialmente valores de punto flotante de doble precisin. No hay distincin entre nmeros enteros y de punto flotante (tambin conocidos como fracciones) todos ellos son slo nmeros. Aqu tenemos algunos ejemplos vlidos de nmeros: 4 4. .4 0.4 4.57e-3 0.3e12

String (Cadena)
Una cadena es simplemente una secuencia de caracteres. Por ejemplo, Joe2 es una cadena de cuatro caracteres, comenzando con una mayscula J y terminando con el nmero 2. Las cadenas pueden variar completamente en longitud; una cadena puede contener una sola letra, una sola palabra o el contenido de un libro entero. Las cadenas pueden contener espacios e incluso caracteres exticos, tales como smbolos de cambios de lnea (retornos de carro) y smbolos de saltos de lnea. De hecho, las cadenas pueden contener una combinacin de caracteres ASCII 8.bit vlidos, incluyendo caracteres invalidados (\0). Las cadenas pueden ser utilizadas de lo ms intuitiva y naturalmente. Debern ser delimitadas por comillas simples o dobles. Estos son unos ejemplos del uso de cadenas: Name = "Joe Blow"; Dialog.Message("Ttulo", "Hola, cmo ests?"); LastName = 'Blow'; Normalmente las comillas dobles se usan en cadenas, pero las comillas simples pueden ser tiles si tienes una cadena que contiene comillas dobles. Para cualquier tipo de comillas que uses puedes incluirle el otro tipo en su interior de la cadena sin que afecte. Por ejemplo: dobles = "How's that again?"; simples = 'She said "Talk to the hand," and I was all like "Dude!"'; Si usamos comillas dobles para la segunda lnea, deber verse as: evadidas = "She said \"Talk to the hand,\" and I was all like \"Dude!\""; Normalmente, el motor de Script interpreta las comillas dobles como una marca del inicio o fin de una cadena. Para incluir comillas dobles dentro de una cadena con comillas dobles, necesitas escabullirlas con barras inversas. Esto le indica al motor de Script que quieres incluir un carcter de cita literal en la cadena. La barra inversa y comilla (\") es conocida como una escape sequence (secuencia de escape). Una secuencia de escape es una secuencia especial de caracteres que son convertidos o traducidos en algo ms por el motor de Script. Las secuencias de escape te permiten incluir cosas que no pueden escribirse directamente dentro de una cadena. Las secuencias de escape que puedes usar incluyen: \a - bell \b - backspace (retroceder un espacio) \f - form feed (avance de pgina) \n - newline (nueva lnea)

\r - carriage return (retorno de lnea) \t - horizontal tab (tabulador horizontal) \v - vertical tab (tabulador vertical) \\ - backslash (barra inversa) \" - quotation mark (marca de cita literal) \' - apostrophe (apstrofe) \[ - left square bracket (corchete izquierdo) \] - right square bracket (corchete derecho) As, por ejemplo, si quieres representar tres lneas de texto en una sola cadena, debers utilizar lo siguiente: Lineas = "Lnea uno.\nLnea dos.\nLnea tres"; Dialog.Message("Aqu est la cadena ", Lineas); Esto le asigna una cadena a la variable nombrada Lineas, y utiliza la secuencia de escape de nueva lnea para iniciar un nuevo rengln despus de cada oracin. La funcin Dialog.Message despliega el contenido de la variable Lineas en un cuadro de dilogo, como ste:

Nota: Si eres muy observador, habrs notado que el nombre de la variable Lineas no tiene acento en la letra i, en cambio en el contenido de la variable si estamos acentuando todas las palabras Lnea. Recuerda que el nombre de una variable no deber estar acentuado porque de lo contrario marcar un error de Script debido a que lo interpreta como una variable no vlida; por otro lado el contenido de las cadenas puede incluir cualquier carcter por muy especial que ste sea. Otro ejemplo comn es cuando quieres representar una ruta de archivo tal como C:\Mi Carpeta\Mis Datos.txt. Slo necesitas acordarte de la secuencia de escape de barra inversa: MiRuta = "C:\\Mi Carpeta\\Mis Datos.txt"; Cada barra inversa doble representa una barra inversa simple cuando es utilizada dentro de una cadena. Si conoces el cdigo ASCII, puedes usar un carcter de barra inversa seguido por un nmero de hasta tres dgitos para representar cualquier carcter por su valor ASCII. Por ejemplo, el valor ASCII para un carcter de nueva lnea es 10, as que las dos lneas mostradas a continuacin hacen exactamente la misma cosa: Lineas = "Lnea uno.\nLnea dos.\nLnea tres"; Lineas = "Lnea uno.\10Lnea dos.\10Lnea tres"; Sin embargo, no necesitars usar este formato con mucha frecuencia, si acaso alguna vez.

Puedes tambin definir cadenas en lneas mltiples usando corchetes dobles ([[ and ]]). Una cadena entre corchetes dobles no necesita ningn carcter de secuencia de escape. Los corchetes dobles te permiten introducir caracteres especiales como barras inversas, comillas y nuevas lneas directamente en el interior de la cadena. Por ejemplo: Lineas = [[Lnea uno. Lnea dos. Lnea tres.]]; es equivalente a: Lineas = "Lnea uno.\nLnea dos.\nLnea tres"; Esto puede ser til si has pre-formateado texto que quieras usar como una cadena, y no quieres tener que convertir todos los caracteres especiales en secuencias de escape La ltima cosa importante que hay que saber acerca de las cadenas, es que el motor de Script proporciona conversin automtica entre nmeros y cadenas en tiempo de ejecucin. Si una operacin numrica es aplicada a una cadena, el motor trata de convertir la cadena a un nmero para la operacin. Por supuesto, esto slo tendr xito si la cadena contiene algo que pueda ser interpretado como un nmero. Por ejemplo, las siguientes dos lneas son vlidas: a = "10" + 1; -- El resultado es 11 b = "33" * 2; -- El resultado es 66 Sin embargo, las siguientes dos lneas no te daran la misma conversin en el resultado: a = "10+1"; -- El resultado es la cadena "10+1" b = "hola" + 1; -- ERROR, no se puede convertir "hola" en un nmero Para ms informacin del trabajo con cadenas, dirgete al tema Manipulacin de Cadenas.

Nil (Nulo)
Nil es un tipo especial de valor. Bsicamente representa la ausencia de cualquier otro tipo de valor. Puedes asignar nil a una variable slo como cualquier otro valor. Date cuenta que esto no es lo mismo que asignar las letras nil a una variable, como en una cadena. Al igual que otras palabras clave, nil debe ser dejada sin comillas para que sea reconocida. Tambin deber ser introducida con todas las letras en minscula. Nil siempre evaluar como falso cuando sea usada en una condicin b = nil; if b then -- Cualquier lnea de script aqu -- no ser ejecutada end Tambin puede ser usada para borrar una variable

y = "Joe Blow"; y = nil; En el ejemplo de arriba, y no contendr por ms tiempo un valor despus de la segunda lnea.

Boolean (Booleano)
Los tipos de variables Boolean (o Booleanas) pueden tener uno de estos dos valores; true (verdadero) o false (falso). Pueden ser usadas en condiciones y para ejecutar operaciones lgicas Booleanas. Por ejemplo: boolybooly = true; if boolybooly then -- Cualquier script aqu ser ejecutado end Esto establece una variable nombrada boolybooly como true (verdadera), y entonces la utiliza en una declaracin if. Similarmente: a = true; b = false; if (a y b) then -- Cualquier script aqu no ser ejecutado porque -- true y false es false. end Esta vez, la declaracin if necesita que tanto a como b sean true (verdaderas) para que las lneas dentro de ella sean ejecutadas. En este caso, eso no suceder porque b ha sido establecido como false (falso).

Function (Funcin)
El motor de Script te permite definir tus propias funciones (o sub-rutinas), las cuales esencialmente son pequeas piezas de script que pueden ser ejecutadas a peticin. Cada funcin tiene un nombre, el cual es utilizado para identificar la funcin. De hecho puedes usar el nombre de esa funcin como un tipo especial de valor para almacenar una referencia a esa funcin en una variable, o pasarla a otra funcin. Esta clase de referencia es del tipo function. Para ms informacin sobre funciones, revisa el tema Funciones.

Table (Tabla)
Las tablas son un mtodo muy poderoso para almacenar listas de valores indexados bajo un nombre. Las tablas son de hecho arreglos conectivos, es decir, son arreglos que pueden ser indexados no slo con nmeros, sino con cualquier tipo de valor (incluyendo cadenas). Aqu estn unos cuantos ejemplos (se analizan con ms detalle las tablas en el tema Tablas): Ejemplo 1: muchachos = {"Adn", "Bruno", "Daniel"}; Dialog.Message("Segundo nombre en la lista", muchachos[2]); Esto mostrar un cuadro de dilogo con la palabra Bruno en l.

Ejemplo 2: t = {}; t.Nombre = "Miguel"; t.Apellido = "Ramrez"; t.Ocupacion = "Electricista"; Dialog.Message(t.Nombre, t.Ocupacion); Esto mostrar el siguiente cuadro de dilogo:

Tambin puedes asignar tablas a otras variables. Por ejemplo: tabla_uno = {}; tabla_uno.Nombre = "Miguel"; tabla_uno.Apellido = "Ramrez"; tabla_uno.Ocupacion = "Electricista"; tabla_dos = tabla_uno; ocupacion = tabla_dos.Ocupacion; Dialog.Message(b.Nombre, ocupacion); Las tablas pueden ser indexadas usando notacin de arreglo (mi_tabla[1]), o por notacin de punto si no se index por nmeros (mi_tabla.Apellido). Date cuenta que cuando le asignas una tabla a otra, como en la siguiente lnea: tabla_dos = tabla_uno; de hecho esto no copia la tabla_uno dentro de la tabla_dos. Ms bien la tabla_dos y la tabla_uno se refieren ambas a la misma tabla. Esto es porque el nombre de una tabla en realidad se refiere a una direccin en memoria donde los datos dentro de la tabla son almacenados. As, cuando asignas el contenido de la variable tabla_uno a la variable tabla_dos, ests copiando la direccin, y no los datos actuales. Esencialmente ests haciendo que las dos variables se enfoquen a la misma tabla de datos. Para copiar el contenido de una tabla, necesitas crear una nueva tabla y entonces copiar todos los datos sobre un elemento a la vez. Para ms informacin del copiado de tablas, dirgete al tema Tablas)

Variable de Asignacin
Las variables pueden tener nuevos valores asignados a ellas usando el operador de asignacin (=). Esto incluye el copiar el valor de una variable dentro de otra. Por ejemplo: a = 10; b = "Estoy feliz"; c = b;

Es interesante notar que el motor de Script soporta asignacin mltiple: a, b = 1, 2; Dentro del script de arriba, la variable a contiene el nmero 1 y la variable b contiene el nmero 2. Las tablas y las funciones son algo as como un caso especial: cuando usas el operador de asignacin (=) en una tabla o funcin, creas un sobrenombre que se refiere a la misma tabla o funcin de la variable que est siendo copiada. Los programadores le llaman a este copiado by reference (por referencia), opuesto al copiado by value (por valor).

EXPRESIONES Y OPERADORES
Una expresin es cualquier cosa que evale a un valor. Esta puede incluir un valor simple tal como 6 o un valor compuesto construido con operadores tal como 1 + 3. Puedes usar parntesis para agrupar expresiones y controlar el orden en el cual sern evaluadas. Por ejemplo, todas las siguientes lneas evaluarn el mismo valor: a = 10; a = (5 * 1) * 2; a = 100 / 10; a = 100 / (2 * 5);

Operadores Aritmticos
Los Operadores Aritmticos son utilizados para ejecutar operaciones matemticas en nmeros. Los siguientes operadores matemticos son soportados: + (adicin) - (substraccin) * (multiplicacin) / (divisin) unary - (negativo) Aqu tienes algunos ejemplos: a = 5 + 2; b = a * 100; veintitrs por ciento = 23 / 100; neg = -29; pos = -neg;

Operadores de Relacin
Los Operadores de Relacin te permiten comparar la manera en que un valor se relaciona con otro. Los siguientes operadores de relacin son soportados: > (mayor que) < (menor que) <= (menor o igual que) >= (mayor o igual que) ~= (no es igual a) == (igual a) Todos los operadores de relacin pueden ser aplicados a cualquier par de nmeros o par de cadenas. Todos los dems valores slo pueden usar el operador == para comparar si son iguales. Los operadores de relacin regresan valores Booleanos (true (verdadero) o false (falso)). Por ejemplo: 10 > 20; -- da como resultado un false a = 10; a > 300; -- false (3 * 200) > 500; -- true

"Brett" ~= "Lorne" -- true Un punto importante a mencionar es que los operadores == y ~= hacen una prueba de igualdad completa, lo cual significa que cualquier comparacin de cadena hecha con dichos operadores es un caso sensible a maysculas-minsculas. Por ejemplo: "Jojoba" == "Jojoba"; -- true "Gato" == "gato"; -- false "Me gusta mucho" == "Me gusta MUCHO"; -- false "feliz" ~= "FeLiZ"; -- true

Operadores Lgicos
Los Operadores Lgicos son utilizados para ejecutar operaciones Booleanas en valores Booleanos. Los siguientes operadores lgicos son soportados: and (solo es true ambos valores son true) or (true si cualquiera de los valores es true) not (regresa lo opuesto del valor) Por ejemplo: a = true; b = false; c = a y b; -- false d = a y nil; -- false e = not b; -- true Date cuenta que solamente nil y false son consideramos como false, y todos los dems valores son true. Por ejemplo: soyinvisible = nil; if soyinvisible then -- cualquier cdigo puesto aqu no se ejecutar -- porque soyinvisible es considerado false Dialog.Message("No puedes verme!", "Soy invisible!!!!"); end if "Brett" then -- cualquier cdigo puesto aqu s se ejecutar, porque slo nil y false -- son considerados false...cualquier otra cosa, incluyendo cadenas, -- es considerada true Dialog.Message("Y las cadenas?", "Las cadenas son true."); end

Encadenamiento
En el script de AutoPlay, el operador de encadenamiento es dos puntos (..). Este es usado para combinar dos o ms cadenas juntas. No tienes que poner espacios antes y despus de los dos puntos, pero puedes hacerlo si quieres. Por ejemplo:

nombre = "Jos".." Bonilla"; -- asigna "Jos Bonilla" a nombre b = nombre .. " es nmero " .. 1; -- asigna " Jos Bonilla es nmero 1" a b

Prioridad de Operadores
Se dice que los operadores tienen prioridad, lo cual es una forma de describir las reglas que determinan cules operadores se ejecutan primero en una serie de expresiones. Un simple ejemplo sera la expresin 1 + 2 * 3. El operador de multiplicacin (*) tiene prioridad ms alta que el operador de adicin (+), de modo que esta expresin es equivalente a 1 + (2 * 3). En otras palabras, la expresin 2 * 3 es ejecutada primero, y luego 1 + 6 se ejecuta, resultando un valor final de 7. Se puede pasar por alto el orden natural de prioridad con el uso de parntesis. Por ejemplo, la expresin (1 + 2) * 3 da como resultado el 9. Los parntesis hacen que la sub-expresin entera (1 + 2) sea el valor izquierdo del operador de multiplicacin (*). Esencialmente, la subexpresin 1 + 2 es evaluada primero, y el resultado es luego usado en la expresin 3 * 3. La prioridad de operadores tiene el siguiente orden, partiendo de la prioridad ms baja a la ms alta: and or < > <= >= ~= == .. +*/ not - (unary) ^ Se dice tambin que los operadores tienen asociatividad, que es una forma de describir cules expresiones son ejecutadas primero cuando los operadores tienen igual prioridad. En el motor de Script, todos los operadores binarios son asociativos izquierdos, esto quiere decir que cuando dos operadores tienen la misma prioridad, la operacin de la izquierda se ejecuta primero. La excepcin es el operador de exponenciacin (^), el cual es asociativo derecho. Cuando tengas dudas, siempre puedes usar parntesis explcitos para controlar la prioridad. Por ejemplo: a + 1 < b/2 + 1 ...es lo mismo que: (a + 1) < ((b/2) + 1) ...igualmente, puedes usar parntesis para cambiar el orden de los clculos: a + 1 < b/(2 + 1) En este ltimo ejemplo, en vez de que 1 sea aadido a la mitad de b, b es dividido entre 3.

Estructuras de Control
El motor de Script soporta las siguientes estructuras de control: if, while, repeat y for. If Una declaracin if evala su condicin y entonces ejecuta la parte then slo si la condicin es true. Una declaracin if es finalizada por la palabra clave end. La sintaxis bsica es: if condicion then haz algo aqu end Por ejemplo: x = 50; if x > 10 then Dialog.Message("resultado", "x es ms grande que 10"); end y = 3; if ((35 * y) < 100) then Dialog.Message("", "y veces 35 es menor que 100"); end En el script de arriba, solamente el primer cuadro de dilogo ser mostrado, porque la segunda condicin if no es true 35 veces 3 es 105, pero 105 no es menor que 100. Tambin puedes usar else y elseif para aadir ms ramificaciones a la declaracin if: x = 5; if x > 10 then Dialog.Message("", "x es mayor que 10"); else Dialog.Message("", "x es menor o igual a 10"); end En este ejemplo, el segundo cuadro de dilogo deber mostrarse porque 5 no es mayor que 10. Veamos un ltimo ejemplo: x = 5; if x == 10 then Dialog.Message("", "x is exactamente 10"); elseif x == 11 then Dialog.Message("", "x is exactamente 11"); elseif x == 12 then Dialog.Message("", "x is exactamente 12"); else Dialog.Message("", "x no es 10, 11 o 12"); end En este ejemplo, el ltimo cuadro de dilogo ser mostrado debido a que x no es igual a 10, 11 o 12.

While
La declaracin while es utilizada para ejecutar el mismo paquete de script una y otra vez hasta que una condicin sea encontrada. Al igual que las declaraciones if, las declaraciones while son finalizadas con la palabra clave end. La sintaxis bsica es: while condicion do haz algo aqu end La condicin debe ser true para que las acciones dentro de la declaracin while (la parte haz algo aqu) sea ejecutada. La declaracin while continuar repitindose hasta que esta condicin sea true. As es como trabaja: Si la condicin es true, todas las acciones entre el while y su correspondiente end sern ejecutadas. Cuando el end es alcanzado, la condicin ser reevaluada, y si sta an es true, las acciones entre while y end sern ejecutadas de nuevo. Las acciones continuarn en ciclo hasta que la condicin sea evaluada como false. Por ejemplo: a = 1; while a < 10 do a = a + 1; end En el ejemplo de arriba, la lnea a = a + 1; ser ejecutada 9 veces. Puedes romper un ciclo while en el momento que quieras usando la palabra clave break. Por ejemplo: count = 1; while count < 100 do count = count + 1; if count == 50 then break; end end Aunque la declaracin while est dispuesta a contar de 1 a 99, la declaracin if causar que este ciclo termine en el momento que la cuenta alcance 50.

Repeat
La declaracin repeat es similar a la declaracin while, excepto que la condicin es comprobada al final de la estructura en lugar de verificarse al inicio. La sintaxis bsica es: repeat haz algo aqu until condicion Por ejemplo: i = 1; repeat i = i + 1; until i > 10

Esto es similar a uno de los ciclos while que se explic arriba, pero esta vez, el ciclo es ejecutado 10 veces. La parte i = i + 1; es ejecutada antes de que la condicin determine que i es ahora ms grande que 10. Puedes interrumpir este ciclo en el momento que quieras usando la palabra clave break. Por ejemplo: count = 1; repeat count = count + 1; if count == 50 then break; end until count > 100 Una vez ms, esto detendr el ciclo en el momento en que la cuenta sea igual a 50.

For
La declaracin for es utilizada para repetir un bloque de script un determinado nmero de veces. La sintaxis bsica es: for variable = start,end,step do do something here end La variable puede ser nombrada como desees. Esta declaracin for es utilizada para contar el nmero de paseos a lo largo del ciclo for. Comienza en el valor start que especifiques, y luego cambia por la cantidad en step despus de cada paseo a travs del ciclo. En otras palabras, el step es aadido al valor en la variable despus de que las lneas entre for y end son ejecutadas. Si el resultado es menor o igual a el valor end, el ciclo contina desde el principio. Por ejemplo: -- Este ciclo cuenta de 1 a 10: for x = 1, 10 do Dialog.Message("Number", x); end El ejemplo anterior despliega 10 mensajes de dilogo en fila, contando de 1 a 10. Date cuenta que el step es opcional (si no proporcionas un valor para el step, por defecto es 1). Aqu ponemos un ejemplo que utiliza un step de -1 para hacer que el ciclo for cuente hacia atrs: -- Este ciclo cuenta de 10 a 1: for x = 10, 1, -1 do Dialog.Message("Nmero", x); end Este ejemplo mostrar 10 mensajes de dilogo en fila, contando hacia atrs desde 10 y retrocediendo hasta 1. Puedes interrumpir un ciclo for en el momento que quieras usando la palabra clave break

for i = 1, 100 do if count == 50 then break; end end De nuevo, esto finalizar el ciclo en el momento que la cuenta sea igual a 50. Hay tambin una variacin en el ciclo for que opera en tablas. Para ms informacin sobre esto, ve a la seccin El Uso de For para Enumerar Tablas.

Tablas (Arreglos)
Las tablas son muy tiles. Pueden ser utilizadas para almacenar cualquier tipo de v alor, incluyendo funciones o incluso otras tablas.

Creacin de Tablas
Generalmente hay dos formas de crear una tabla desde cero. El primer mtodo utiliza llaves para especificar una lista de valores: mi_tabla = {"manzana","naranja","durazno"}; tabla_asociativa = {fruta="manzana", vegetal="zanahoria"} El segundo mtodo es crear una tabla en blanco y luego aadir los valores uno por uno: mi_tabla = {}; mi_tabla[1] = "manzana"; mi_tabla[2] = "naranja"; mi_tabla[3] = "durazno"; tabla_asociativa = {}; tabla_asociativa.fruta = "manzana"; tabla_asociativa.vegetal = "zanahoria"; Acceso a los Elementos de la Tabla Cada registro de informacin almacenado en una tabla es conocido con un elemento. Cada elemento consta de una clave, la cual sirve como el ndice dentro de la tabla, y un valor que es asociado con la clave Generalmente, hay dos formas de accesar un elemento: puedes usar notacin de arreglo o notacin de punto. La notacin de arreglo es utilizada tpicamente con arreglos numricos, los cuales son simplemente tablas donde todas las claves son nmeros. La notacin de punto es usada normalmente con arreglos asociativos, los cuales son tablas donde las claves son cadenas. Aqu te mostramos un ejemplo de notacin de arreglo: t = { "uno", "dos", "tres"}; Dialog.Message("El elemento uno contiene:", t[1]); Y aqu un ejemplo de notacin de punto:

t = { first="uno", second="dos", third="tres"}; Dialog.Message("El elemento 'first' contiene:", t.first);

Arreglos Numricos:
Uno de los usos ms comunes en las tablas son los arreglos. Un arreglo es una coleccin de valores que estn indexados por claves numricas. En el motor de Script, los arreglos numricos estn basados en 1. Es decir, que comienzan a indexarse en 1. Aqu estn algunos ejemplos del uso de Arreglos Numricos: Ejemplo 1: miArreglo = {255,0,255}; Dialog.Message("Primer Nmero", miArreglo [1]); Esto desplegar un mensaje de dilogo conteniendo el nmero 255. Ejemplo 2: alfabeto = {"a","b","c","d","e","f","g","h","i","j","k", "l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; Dialog.Message("Sptima Letra", alfabeto[7]); Esto desplegar un mensaje de dilogo conteniendo la letra g. Ejemplo 3: miArreglo = {}; miArreglo[1] = "Opcin Uno"; miArreglo[2] = "Opcin Dos"; miArreglo[3] = "Opcin Tres"; Esto es exactamente lo mismo que lo siguiente: miArreglo = {"Opcin Uno", " Opcin Dos", " Opcin Tres"};

Arreglos Asociativos
Los Arreglos Asociativos son lo mismo que los Arreglos Numricos, excepto que en los primeros los parmetros pueden ser nmeros, cadenas o incluso funciones. Aqu est un ejemplo de un arreglo asociativo que usa un apellido como un parmetro, y un nombre como el valor. arrNombres = {Cuevas="Juan", Cardona="Rogelio", Contreras="Jos", Herrera="Christian", Hitchcock="Alfredo"}; Dialog.Message("El nombre de Cuevas", arrNombres.Cuevas); El mensaje de dilogo resultante ser como ste:

Aqu est un ejemplo de una simple base de datos de empleados que sigue la pista de los nombres y fechas de nacimiento de empleados, indexados por nmero de empleado: Empleados = {}; -- Construye una tabla vaca para los nmeros de empleado -- almacena informacin de cada empleado en su propia tabla Empleado1 = {Nombre="Juan Cuevas", Nacimiento="07/02/82"}; Empleado2 = {Nombre="Rogelio Cardona", Nacimiento="12/25/79"}; -- almacena la tabla de informacin de cada empleado -- en el nmero apropiado de la tabla de empleados Empleados[100099] = Empleado1; Empleados[137637] = Empleado2; -- ahora la escritura "Empleados[100099]" es lo mismo que la escritura "Empleado1" Dialog.Message("Fecha de Nacimiento",Empleados[100099].Nacimiento); El mensaje de dilogo resultante tendr este aspecto:

El Uso de For para Enumerar Tablas Hay una versin especial de la declaracin for que te permite enumerar el contenido de un arreglo rpida y fcilmente. La sintaxis es: for index,value in table do operate on index and value end Por ejemplo: mitabla = {"Uno","Dos","Tres"}; -- despliega un mensaje para cada artculo de la tabla for j,k in mitabla do Dialog.Message("Artculo", j .. "=" .. k); end El resultado sern tres mensajes de dilogo en fila, uno por cada elemento en mitabla, como estos:

Acurdate de la declaracin for de arriba, porque es una manera rpida y fcil de inspeccionar los valores en una tabla. Si slo quieres los parmetros de una tabla, puedes omitir la parte value de la declaracin for: a = {Uno=1,Dos=2,Tres=3}; for k in a do Dialog.Message("Indice de Tabla",k); end El script de arriba mostrar tres mensajes de dilogo en fila, con el texto Uno, Tres, y luego Dos. Cmo? Por qu los elementos de la tabla no estn es orden? La razn de esto es que internamente el motor de Script no almacena tablas como arreglos, sino en una estructura super-eficiente conocida como una tabla chapuza. (No te preocupes, al principio muchos se confunden con las tablas chapuza). La cosa importante a saber es que cuando defines elementos de tabla, stos no son almacenados necesariamente de manera que los definas o los aadas, a menos que uses un arreglo numrico (por ejemplo una tabla indexada con nmeros del 1 al que quieras).

Copiar Tablas
Copiar tablas es un poco diferente a copiar otro tipo de valores. A diferencia de las variables, t no puedes usar el operador de asignacin para copiar el contenido de una tabla dentro de otra. Esto es porque el nombre de la tabla de hecho se refiere a una direccin en memoria donde los datos dentro de la tabla son almacenados. Si tratas de copiar una tabla en otra usando el operador de asignacin, acabars copiando la direccin, y no los datos actuales. Por ejemplo, si quisieras copiar una tabla, y luego modificar la copia, tendras que intentar algo como esto: tabla_uno = { color="Rojo", temperatura="Caliente" }; -- crear una copia tabla_dos = tabla_uno; -- modificar la copia tabla_dos.temperatura = "Fra"; Dialog.Message("Temperatura Tabla Uno:", tabla_uno.temperatura); Dialog.Message("Temperatura Tabla Dos:", tabla_dos.temperatura); Si ejecutas este script, vers los siguientes dos dilogos:

Espera un minuto el cambio del elemento temperatura en tabla_dos tambin lo cambi en tabla_uno. Por qu cambiaron ambos? La respuesta es simple: porque las dos son de hecho la misma tabla. Internamente, el nombre de una tabla slo se refiere a una ubicacin en memoria.

Cuando tabla_uno es creada, una porcin de memoria es dejada aparte para mantener su contenido. La ubicacin (o direccin) de esta memoria es la que es asignada a la variable llamada tabla_uno. Asignar tabla_uno a tabla_dos slo copia la direccin de memoria, no la memoria actual en s misma. Es como anotar el domicilio de una biblioteca en un pedazo de papel, y luego darle ese papel a tu amigo. T no ests dndole la biblioteca entera, con estantes de libros y todo slo le proporcionaste la ubicacin donde pueda ser encontrada. Si quisieras actualizar una copia de la biblioteca, tendras que crear un nuevo edificio, fotocopiar cada libro individualmente, y luego almacenar las fotocopias en la nueva ubicacin. Eso es demasiado, como lo es con tablas tambin. Para crear una copia completa de una tabla, con su contenido y todo, necesitas crear una nueva tabla y luego copiar todos los elementos de uno en uno. Afortunadamente, la declaracin for hace esto realmente fcil de hacer. Por ejemplo, aqu est una versin modificada de nuestro ms reciente ejemplo, que crea una copia verdadera de tabla_uno. tabla_uno = { color="Rojo", temperatura="Caliente" }; -- crear una copia tabla_dos = {}; for index, value in tabla_uno do tabla_dos [index] = value; end -- modificar la copia tabla_dos.temperatura = "Fra"; Dialog.Message("Temperatura Tabla Uno:", tabla_uno.temperatura); Dialog.Message("Temperatura Tabla Dos:", tabla_dos.temperatura); Esta vez, los dilogos muestran que la modificacin de tabla_dos no afecta para nada a tabla_uno:

Funciones en Tablas
Hay un buen nmero de Funciones de Tabla integradas a tu disposicin, las cuales puedes utilizar para hacer tales cosas como insertar, remover y cuantificar elementos dentro de una tabla. Para ms informacin sobre las Funciones de Tabla, por favor dirgete a Program Reference / Actions / Table en la Ayuda en Lnea.

Funciones
Por mucho, la ms estupenda y poderosa caracterstica del motor de Script son las Funciones. Ya has visto muchas de ellas utilizadas a lo largo de este documento, tales como Dialog.Message.. Las Funciones simplemente son porciones de script que puedes definir, nombrar y luego llamar desde donde quieras. Aunque hay muchas funciones integradas en AutoPlay, puedes tener las tuyas propias que se ajusten a la medida de tus necesidades. En general, las funciones estn definidas como sigue: function function_name (arguments) function script here return return_value; end La primera parte es la palabra clave function. Esta le dice al motor de Script que lo que sigue es una definicin de funcin. La function_name es simplemente un nombre nico para tu funcin. Los arguments son parmetros (o valores) que sern transferidos a la funcin cada vez que sea llamada. Una funcin puede recibir cualquier nmero de argumentos desde 0 a infinito (bueno, no hasta infinito, pero casi). La palabra clave return le dice a la funcin que devuelva uno o ms valores al script que la llam. La forma ms fcil de aprender acerca de las funciones es mirar algunos ejemplos. En este primer ejemplo, haremos una simple funcin que muestre un cuadro de mensaje. Esta no toma ningn argumento y no devuelve nada. function HelloWorld() Dialog.Message("Bienvenido","Hola Mundo"); end Date cuenta que si pones el script de arriba dentro de un evento y lo previsualizas en tu aplicacin, nada sucede. Bueno, esto es verdad y no lo es. Es verdad que nada visible sucede pero lo mgico es que t no puedes verlo. Cuando el evento es lanzado y el script function es ejecutado, la funcin llamada HelloWorld viene a ser parte del motor de Script. Esto significa que est ahora disponible para el resto de la aplicacin en cualquier otro script. Esto plantea un punto importante acerca del Script en AutoPlay Media Studio. Cuando se construye una funcin, la funcin no se adentra en el motor sino hasta que el script es ejecutado. Lo cual significa que si defines HelloWorld() en el evento On Click de un botn, pero ese evento nunca es activado (debido a que el usuario no hace click sobre el botn), entonces la funcin HelloWorld() nunca existir. Es decir, no sers capaz de llamarla desde alguna otra parte. Esto es porque, en general, es lo mejor para definir tus funciones globales en el script global del proyecto. (Para acceder al script global, elige el men Project > Global Functions). Ahora, regresemos a cosas buenas. Aadamos una lnea para llamar a la funcin verdaderamente: function HelloWorld() Dialog.Message("Bienvenido","Hola Mundo"); end HelloWorld();

La lnea HelloWorld(); le avisa al motor de Script para que ejecute la funcin llamada HelloWorld. Cuando esa lnea sea ejecutada, vers un mensaje de bienvenida con el texto Hola Mundo en l.

Argumentos de Funcin
Llevemos esto un poco ms all y digmosle al cuadro de dilogo cul texto mostrar al aadir un argumento a la funcin function HelloWorld(Mensaje) Dialog.Message("Bienvenido", Mensaje); end HelloWorld("Esto es un argumento"); Ahora el cuadro de dilogo muestra el texto que fue pasado a la funcin. En la definicin de funcin, Mensaje es una variable que automticamente recibe cualquier argumento que sea pasado a la funcin. En la llamada de funcin, pasamos la cadena "Esto es un argumento" como el primer (y nico) argumento para la funcin HelloWorld. Aqu est un ejemplo del uso de argumentos mltiples: function HelloWorld(Titulo, Mensaje) Dialog.Message(Titulo, Mensaje); end HelloWorld("Este es el argumento uno", "Este es el argumento dos"); HelloWorld("Bienvenido", "Hola"); Esta vez, la definicin de funcin utiliza dos variables, una para cada uno de sus argumentos y cada llamada de funcin le pasa dos cadenas a la funcin HelloWorld Nota que cambiando el contenido de esas cadenas, puedes mandar argumentos diferentes a la funcin, y lograr distintos resultados.

Valores Devueltos (o de Retorno)


El siguiente paso es hacer que la funcin devuelva valores al llamado del script. He aqu una funcin que acepta un nmero como su nico argumento, y luego devuelve una cadena conteniendo todos los nmeros desde el uno hasta ese nmero. function Count(n) -- comenzar con una cadena de retorno en blanco ReturnString = ""; for num = 1,n do -- aadir el nmero actual (num) al final de la cadena de retorno ReturnString = ReturnString..num; -- si ste no es el ultimo nmero, entonces aadir una coma y un espacio -- para separar los nmeros un poco en la cadena de retorno if (num ~= n) then ReturnString = ReturnString..", "; end end -- devolver la cadena que fue construida return ReturnString;

end CountString = Count(10); Dialog.Message("Conteo", CountString); Las ltimas dos lneas del script de arriba utilizan la funcin Count para construir una cadena contando del 1 al 10, la almacenan en una variable llamada CountString, y luego muestran el contenido de la variable en un mensaje de dilogo.

Valores Mltiples Devueltos


Adicionalmente, puedes devolver valores mltiples de funciones: function SortNumbers(Number1, Number2) if Number1 <= Number2 then return Number1, Number2 else return Number2, Number1 end end firstNum, secondNum = SortNumbers(102, 100); Dialog.Message("Ordenados", firstNum ..", ".. secondNum); El script anterior crea una funcin llamada SortNumbers que toma dos argumentos y luego devuelve dos valores. El primer valor devuelto es el nmero ms pequeo, y el segundo valor devuelto es el ms grande. Date cuenta que especificamos dos variables para recibir los valores devueltos de la llamada de funcin en la penltima lnea. La ltima lnea del script muestra los dos nmeros en el orden que fueron clasificados por la funcin.

Redefiniendo Funciones
Otra cosa interesante acerca de las funciones es que puedes ignorar (pasar por alto) una previa definicin de funcin simplemente redefinindola. function HelloWorld() Dialog.Message("Mensaje","Hola Mundo"); end function HelloWorld() Dialog.Message("Mensaje ","Hola Tierra"); end HelloWorld(); El script de arriba mostrar un cuadro de dilogo que diga Hola Tierra y no Hola Mundo. Esto es porque la segunda versin de la funcin HelloWorld() hace que la primera sea ignorada.

Poniendo Funciones en Tablas


Una cosa realmente poderosa acerca de las tablas es que stas pueden ser usadas para contener funciones tambin como otros valores. Esto es importante porque te permite estar seguro que tus funciones tienen nombres nicos y estn agrupadas lgicamente. Aqu tenemos un ejemplo: -- Hace las funciones: function HelloEarth() Dialog.Message("Message","Hello Earth"); end

function HelloMoon() Dialog.Message("Message","Hello Moon"); end -- Define una tabla vaca: Hello = {}; -- Asigna las funciones a la tabla: Hello.Earth = HelloEarth; Hello.Moon = HelloMoon; -- Ahora llama a las funciones: Hello.Earth(); Hello.Moon(); Tambin es interesante notar que puedes definir funciones directamente en tu definicin de tabla: Hello = { Earth = function () Dialog.Message("Message","Hello Earth") end, Moon = function () Dialog.Message("Message","Hello Moon") end }; -- Ahora llama a las funciones: Hello.Earth(); Hello.Moon();

Manipulacin de Cadenas (Ligaduras)


En esta seccin cubriremos brevemente algunas de las tcnicas ms comunes de manipulacin de cadenas o ligaduras, tales como conexin y comparacin de cadenas.

Conexin de Cadenas
Ya hemos cubierto el tema de conexin de cadenas, pero vale la pena profundizar sobre l. El operador para la conexin de cadenas es dos puntos en fila (..). Por ejemplo: NombreCompleto = "Luis".."Cardona"; -- NombreCompleto es ahora "Luis Cardona" -- Tambin puedes conectar nmeros dentro de cadenas DiasDelAo = 365; AoCadena = "Hay ".. DiasDelAo.." das en un ao."; Observa que puedes poner espacios en ambos lados de los puntos, o en un solo lado, o no poner ningn espacio. Por ejemplo, las siguientes cuatro lneas lograrn el mismo resultado: foo = "Hello " .. user_name; foo = "Hello ".. user_name; foo = "Hello " ..user_name; foo = "Hello "..user_name;

Comparacin de Cadenas
Despus de la conexin, una de las cosas ms comunes que que rrs hacer con las cadenas es comparar una cadena con otra. Dependiendo de qu constituye una comparacin, sta puede ser muy simple o slo un poco maosa. Si quieres ejecutar una comparacin sensible a diferencia entre maysculas y minsculas, entonces todo lo que tienes que hacer es usar el operador (==). Por ejemplo:

strOne = "Strongbad"; strTwo = "Strongbad"; if strOne == strTwo then Dialog.Message("Adivina qu?", "Las dos cadenas son iguales!"); else Dialog.Message("Hmmm", "Las dos cadenas son diferentes."); end Puesto que el operador == ejecuta una comparacin sensible a diferencia entre maysculas y minsculas cuando es aplicado a cadenas, el script de arriba mostrar un mensaje de dilogo proclamando que las dos cadenas son iguales. Si quieres ejecutar una comparacin no sensible a diferencia entre maysculas y minsculas, entonces necesitas echar mano de las funciones String.Upper o String.Lower, para asegurar que ambas cadenas tienen la misma escritura antes de que las compares. La funcin String.Upper devuelve una versin todas maysculas de la cadena dada, y la funcin String.Lower devuelve una versin todas minsculas. Date cuenta que no importa cul funcin emplees en tu comparacin, siempre y cuando utilices la misma funcin a ambos lados del operador == en tu declaracin. Por ejemplo: strOne = "Mooohahahaha"; strTwo = "MOOohaHAHAha"; if String.Upper(strOne) == String.Upper(strTwo) then Dialog.Message("Adivina qu?", "Las dos cadenas son iguales!"); else Dialog.Message("Hmmm", " Las dos cadenas son diferentes."); end En el ejemplo anterior, la funcin String.Upper convierte strOne a MOOOHAHAHAHA y strTwo a MOOOHAHAHAHA y luego la declaracin if compara los resultados. (Nota: Las dos cadenas originales permanecen sin cambio). De esta manera, no importa cules maysculas o minsculas tenan las cadenas originales; todo lo que importa es si las letras son las mismas.

Conteo de Caracteres
Si alguna vez quieres saber qu tan larga es una cadena, puedes contar fcilmente el nmero de caracteres que contiene. Slo utiliza la funcin String.Length, como en este ejemplo: trabador = "Tres tristes tigres tragaban trigo en tres trises trastos sentados en un trigal..."; num_carac = String.Length(trabador); Dialog.Message("Este trabalenguas tiene:", num_carac .. " caracteres!"); lo cual producir el siguiente mensaje de dilogo:

Encontrando Cadenas
Otra cosa comn que querrs hacer con cadenas es buscar una cadena dentro de otra. Esto es muy simple de hacer usando la accin String.Find. Por ejemplo: strSearchIn = "Verdad que es un da para maravillarse?"; strSearchFor = "maravilla"; -- busca strSearchIn en el interior de strSearchFor nFoundPos = String.Find(strSearchIn, strSearchFor); if nFoundPos ~= nil then -- encuntralo! Dialog.Message("Resultado de la Bsqueda", strSearchFor .. " fue encontrado en la posicin " .. nFoundPos); else -- no hubo suerte Dialog.Message("Resultado de la Bsqueda ", strSearchFor .. " no fue encontrado!"); end ...causara que el siguiente mensaje fuera mostrado:

Consejo: Prueba experimentando con diferentes valores para strSearchFor y strSearchIn.

Reemplazando Cadenas
Una de las cosas ms poderosas que puedes hacer con las cadenas es ejecutar una bsqueda y reemplazar la operacin en ellas. El siguiente ejemplo muestra cmo puedes usar la accin String.Replace para sustituir cada evento de una cadena con otra dentro de una cadena objetivo. strTarget = "Puede haber solo una. Slo una es permitida!"; strSearchFor = "una"; strReplaceWith = "una docena"; strNewString = String.Replace(strTarget, strSearchFor, strReplaceWith); Dialog.Message("Despus de la bsqueda y el reemplazo:", strNewString); -- crea una copia de la cadena objetivo sin espacios en ella strNoSpaces = String.Replace(strTarget, " ", ""); Dialog.Message("Despus de eliminar espacios:", strNoSpaces); El ejemplo anterior mostrar los dos mensajes siguientes:

Extrayendo Cadenas
Hay tres funciones de cadena que te permiten extraer una porcin de una cadena, en vez de copiar la misma cadena entera. Estas funciones son String.Left, String.Right y String.Mid. String.Left copia un nmero de caracteres desde el comienzo de la cadena. String.Right hace lo mismo, pero contando desde el extremo derecho de la cadena. String.Mid te permite copiar un nmero de caracteres comenzando desde cualquier posicin en la cadena. Puedes usar estas funciones para ejecutar todo tipo de operaciones avanzadas en cadenas Aqu est un ejemplo bsico mostrando cmo trabajan estas funciones: strOriginal = "De verdad me da gusto verte de nuevo."; -- copia los primeros 22 caracteres dentro de strLeft strLeft = String.Left(strOriginal, 22); -- copia los ltimos 15 caracteres dentro de strRight strRight = String.Right(strOriginal, 15); -- crea una nueva cadena con las dos piezas strNeo = String.Left .. "estupendo" .. strRight .. " Detente."; -- copia la palabra "gusto" dentro de strMiddle strMiddle = String.Mid(strOriginal, 22, 5);

Convirtiendo Cadenas Numricas a Nmeros


Puede haber ocasiones en que tengas una cadena numrica y necesites convertirla a un nmero. Por ejemplo, si tienes un campo de entrada donde el usuario pueda introducir su edad, y t lees en el texto lo que l ha tecleado, podras obtener un valor como 31, puesto que el lo escribi. Aunque este valor es realmente una cadena que consta de los caracteres 3 y 1. Si trataras de comparar este valor con un nmero, obtendras un error de sintaxis diciendo que intentaste comparar un nmero con una cadena. Por ejemplo, si le asignaras el siguiente script al evento OnClick de un botn: edad = "31"; if edad > 18 then Dialog.Message("", "Eres mayor de 18."); end ...se producira el siguiente mensaje de error:

El problema en este caso es que la lnea dos del script compara el contenido de la variable edad con el nmero 18: if age > 18 then Esto genera un error porque edad contiene una cadena y no un nmero. El motor de script no te permite comparar nmeros con cadenas de esta manera. No hay forma de saber si queras tratar age como un nmero, o tratar 18 como una cadena. La solucin es simplemente convertir el valor de edad a un nmero antes de compararlo. Hay dos formas de hacer esto. Una forma es usar la funcin String.ToNumber. La funcin String.ToNumber convierte una cadena numrica a el nmero equivalente, de tal modo que pueda ser usado en una comparacin numrica. edad = "31"; if String.ToNumber(edad) > 18 then Dialog.Message("", "T eres mayor de 18."); end Lo que producira un mensaje de dilogo como el siguiente:

La otra forma saca ventaja de la habilidad del motor de script para convertir nmeros en cadenas cuando sabe cules son sus intenciones. Por ejemplo, si ests ejecutando una operacin aritmtica (tal como la suma de dos nmeros), el motor automticamente convertir por ti cualquier cadena numrica a nmeros: edad = "26" + 5; -- el resultado ser un valor numrico El ejemplo anterior no generar ningn error porque el motor de script entiende que la nica forma de que la declaracin tenga sentido es que diste a entender que se usara la cadena numrica como un nmero. Como resultado, el motor automticamente convierte la cadena numrica a un nmero de modo que se pueda ejecutar el clcul o. Sabiendo esto, podemos convertir una cadena numrica en un nmero sin cambiar su valor simplemente aadiendo un 0 en ella, tal como se muestra a continuacin: edad = "31"; if (edad + 0) > 18 then Dialog.Message("", "T eres mayor de 18."); end En el ejemplo de anterior, el aadirle 0 a una variable, consigue que el motor convierta el valor a un nmero, y que el resultado luego sea comparado con 18. Ya no habr error!

Otras Funciones Incorporadas Funciones de Script


Hay tres funciones incorporadas que te pueden ser de utilidad: dofile, require, y type. dofile Carga y ejecuta un archivo de script. El contenido del archivo ser ejecutado como si ste fuera escrito directamente dentro del script. La sintaxis es: dofile(file_path); Por ejemplo, digamos que escribimos el siguiente script dentro de un archivo llamado MyScript.lua (justamente un archivo de texto conteniendo este script, creado con el Wordpad de Windows o algn otro editor de texto). Es indispensable que guardes este archivo con la opcin Guardar como de tu editor de texto y debes guardarlo como tipo Texto sin Formato o con la opcin Todos los archivos, es decir, no lo guardes como .txt. Dialog.Message("Hola", "Mundo"); Ahora arrastramos y soltamos el archivo dentro de la ventana. (Esto copiar el archivo dentro de la carpeta Scripts de nuestro proyecto). Aparecer un dilogo que pregunta si queremos aadir una lnea requiere a nuestro script global. Por ahora haz click en No. Explicaremos la declaracin requiere ms tarde.

Ahora, donde sea que agreguemos la siguiente lnea de script para un evento: dofile(_SourceFolder.."\\AutoPlay\\Scripts\\MyScript.lua"); ese archivo de script ser leido y ejecutado inmediatamente. En este caso, debers ver un mensaje de dilogo con el mensaje amigable Hola Mundo.

Consejo: Utiliza la funcin dofile para ahorrarte t mismo el tener que volver a escribir o volver a pegar un script dentro de tu proyecto una y otra vez.

require
Carga y ejecuta un archivo de script dentro del motor de programacin. Esta funcin es similar a la dofile, excepto que cargar un archivo dado una vez por sesin, mientras que dofile vuelve a cargar y vuelve a ejecutar el archivo cada vez que es usado. La sintaxis es: require(file_path); As, por ejemplo, incluso si haces dos requerimientos en fila: require("foo.lua"); require("foo.lua"); -- esta lnea no har nada slo la primera lnea ser siempre ejecutada. Despus de eso, el motor de programacin sabe que el archivo ha sido cargado y ejecutado, y en el futuro llama para requerir que el archivo no tenga efecto. Date cuenta que siempre y cuando pongas el archivo .lua dentro de la carpeta Scripts de tu proyecto, ya no tienes que proporcionar una ruta completa del archivo. Por ejemplo: require("MyScript.lua"); ...es lo mismo que: require(_SourceFolder.."\\AutoPlay\\Scripts\\MyScript.lua"); Debido a que require solo cargar un archivo de script dado una vez por sesin, esto es lo ms apropiado para cargar scripts que contienen slo variables y funciones. Puesto que las variables y las funciones son globales por defecto, t solamente necesitas cargarlas una vez; cargar reiteradas veces la misma definicin de funcin slo sera una prdida de tiempo. Esto hace a la funcin require una gran forma de cargar libreras de script externas. Cada script que necesite una funcin desde un archivo externo puede con toda seguridad acudir a la funcin require, y el archivo realmente ser cargado slo la primera vez que sea necesitado.

type
Esta function te dir el tipo de valor contenido en una variable. Esta devuelve el nombre de la cadena del tipo de variable. Los valores vlidos devueltos son nil, number, string, boolean, table, o function. Por ejemplo: a = 989; strType = type(a); -- establece strType como "number" a = "Hola"; strType = type(a); -- establece strType como "string" El tipo de funcin es especialmente til cuando escribes tus propias funciones que necesitan ciertos tipos de datos para poder operar. Por ejemplo, la siguiente funcin utiliza type() para asegurar que ambos de sus argumentos son nmeros: -- encuentra el mximo de dos nmeros function Max(Number1, Number2)

-- asegura que ambos argumentos son numricos if (type(Number1) ~= "number") or (type(Number2) ~= "number") then Dialog.Message("Error", "Please enter numbers"); return nil estamos usando nil para indicar un error de condicin else if Number1 >= Number2 then return Number1; else return Number2; end end end

Depurando Tus Scripts


El Scripting de cualquier tipo de programacin es relativamente fcil una vez que te familiarices con l. Sin embargo, incluso los mejores programadores cometen errores, y necesitan darle una planchadita a las arrugas ocasionales de su cdigo. El ser bueno para depurar scripts reducir el tiempo para lanzar al mercado tus proyectos e incrementar la cantidad de tiempo de descanso. Por favor lee esta seccin para obtener consejos en el uso de Auto Play Media Studio tan habilidosa y eficazmente como sea posible. Esta seccin explicar los mtodos de manipulacin de errores, as como tambin cubrir un buen nmero de tcnicas de depuramiento.

Manipulacin de Errores
Errores de Sintaxis Los errores de sintaxis ocurren cuando la sintaxis (o gramtica) de un script es incorrecta, o una funcin recibe argumentos que no son apropiados. Por ejemplo, considera el siguiente script: foo = Esto es incorrecto porque no hemos asignado nada a la variable foo (el script est incompleto). Este es un error de sintaxis bastante obvio, por lo que deber ser detectado por el motor de programacin en tiempo de construccin (cuando construyas tu proyecto). Otro tipo de error de sintaxis es cuando no le pasas el tipo o nmero correcto de argumentos a una funcin. Por ejemplo, si pruebas y ejecutas este script: Dialog.Message("Hola"); el proyecto se construir bien, debido a que no hay errores de sintaxis obvios en el script. Hasta donde el motor de programacin pueda decir, la llamada de la funcin est bien formada. El nombre es vlido, los parntesis de abertura y cierre concuerdan, las comillas estn en la posicin correcta, e incluso hay un punto y coma de finalizacin de la lnea. Todo se ve en orden. Sin embargo, en tiempo de ejecucin vers algo como lo siguiente:

No se mira tan bien despus de todo!, verdad? Date cuenta que el mensaje dice que dos argumentos son requeridos por la funcin Dialog.Message. Ah, nuestro script slo proporcion un argumento. De acuerdo al prototipo de funcin para Dialog.Message, parece que la funcin puede incluso aceptar ms de cinco argumentos:

Observando con atencin el prototipo de funcin, vemos que los ltimos tres argumentos tienen valores por defecto, los cuales sern utilizados si esos argumentos son omitidos de la llamada de funcin. Los primeros dos argumentos (Title y Text) no tienen valores por defecto, as que no pueden ser omitidos sin generar un error. Para no hacer larga la historia, est bien llamar la accin Dialog.Message con cualquiera de 2 a 5 argumentos pero 1 argumento no es suficiente. Entonces, una sintaxis correcta podra ser: Dialog.Message("Hola", "Bienvenido"); Lo que tendra que mostrar un mensaje de dilogo como el que sigue:

Afortunadamente, errores de sintaxis como ste son usualmente detectados en tiempo de construccin o cuando pruebas tu aplicacin. Usualmente los mensajes de error son bastante claros, haciendo fcil para ti localizar e identificar el problema.

Errores Funcionales
Los errores funcionales son aquellos que ocurren debido a que la funcionalidad de la accin en s misma falla. Estos ocurren cuando a una accin se le da informacin incorrecta, tal como la ruta de un archivo que no existe. Por ejemplo, el siguiente cdigo producir un error funcional: filecontents = TextFile.ReadToString("this_file_don't exist.txt"); Si colocas ese script ahora mismo dentro de un evento y lo pruebas, vers que nada parece suceder. Esto se debe a que los errores funcionales de AutoPlay Media Studio no son automticamente mostrados de la misma forma que los errores de sintaxis. Te dejamos a tu eleccin manipular (o el dejarlos as) estos errores funcionales. La razn de esto es que puede haber ocasiones en que no te importa si una funcin falla. De hecho, podra esperarse as. Por ejemplo, el siguiente cdigo intenta eliminar una carpeta llamada C:\Mi Carpeta Temporal: Folder.Delete("C:\\ Mi Carpeta Temporal ");

Sin embargo, en este caso no te importa si realmente se consigue borrarla, o si, en primer lugar, la carpeta ni exista. T solamente quieres asegurarte que si esa carpeta en particular existe, ser borrada. Si la carpeta no exista, la accin Folder.Delete causa un error funcional debido a que no puedes encontrar la carpeta que t le dijiste que borrara pero puesto que el resultado final es exactamente lo que t queras, no necesitas hacer nada al respecto. Y ciertamente no quieres que el usuario vea ningn mensaje de error. Contrariamente, puede haber ocasiones en que es muy importante para ti saber si una accin falla. Dicho por ejemplo que quieres copiar un archivo muy importante: File.Copy("C:\\Temp\\Mi Archivo.dat","C:\\Temp\\Mi Archivo.bak"); En este caso, realmente quieres saber si esto falla y poder incluso cerrar el programa o informarle al usuario. Aqu es donde las acciones de depuracin te echan una mano.

Acciones de Depuracin
Application.GetLastError Esta es la accin ms importante a usar cuando se trata de averiguar si ha ocurrido un problema. En tiempo de ejecucin siempre hay un valor interno que almacena el estado de la ltima accin que fue ejecutada. Al inicio de una accin, este valor es fijado en 0 (el nmero cero). Esto significa que todo est bien. Si un error funcional ocurre dentro de la accin, el valor es cambiado a algn valor distinto de cero. A este ltimo valor de error se puede acceder en cualquier momento utilizando la accin Application.GetLastError. La sintaxis es: last_error_code = Application.GetLastError(); Aqu est un ejemplo que utiliza esta accin: File.Copy("C:\\Temp\\Mi Archivo.dat","C:\\Temp\\Mi Archivo.bak"); error_code = Application.GetLastError(); if (error_code ~= 0) then -- algn tipo de error ha ocurrido! Dialog.Message("Error", "Error en copia de archivo: "..error_code); Application.Exit(); end El ejemplo anterior informar al usuario que un error ha ocurrido y luego cerrar la aplicacin. Esta no es necesariamente la forma en que todos los errores sern manejados, pero ilustra el punto. Puedes hacer lo que quieras cuando un error ocurra, como llamar una funcin diferente o cualquier otra cosa que puedas idear. El ejemplo anterior tiene un posible problema. Imagina que el usuario ve un mensaje como ste:

Para el usuario sera mucho ms agradable que se mostrara alguna informacin acerca del problema exacto. Bueno, ests de suerte. En tiempo de ejecucin hay una tabla llamada _tblErrorMessages que contiene todos los posibles mensajes de error, indexada por los cdigos de error. Puedes utilizar fcilmente el ltimo nmero de error para obtener un mensaje de error actual que le dar ms sentido al usuario del que le da un nmero como 1021. Por ejemplo, aqu tenemos un script modificado para mostrar la cadena de error actual: File.Copy("C:\\Temp\\Mi Archivo.dat","C:\\Temp\\Mi Archivo.bak"); error_code = Application.GetLastError(); if (error_code ~= 0) then -- algn tipo de error ha ocurrido! Dialog.Message("Error", "Error en copia de archivo: " .. _tblErrorMessages[error_code]); Application.Exit(); end Ahora el script producir el siguiente mensaje de error:

La informacin es mucho ms clara ahora! Slo recuerda que el valor del ltimo error se reanuda cada vez que una accin es ejecutada. Por ejemplo, el siguiente script no producir un mensaje de error: File.Copy("C:\\Temp\\Mi Archivo.dat","C:\\Temp\\Mi Archivo.bak"); -- En este punto Application.GetLastError() podra no ser cero, pero... Dialog.Message("Qu tal","Hola Mundo"); -- Ups, ahora el nmero del ltimo error ser para la accin Dialog.Message, -- y no para la accin File.Copy. La accin Dialog.Message reajustar el -- nmero del ltimo error a 0, y las siguientes lneas no percibirn ningn -- error que haya sucedido en la accin File.Copy. error_code = Application.GetLastError(); if (error_code ~= 0) then -- Algn tipo de error ha ocurrido! Dialog.Message("Error", "Error en copia de archivo: ".. _tblErrorMessages[error_code]); Application.Exit(); end

Debug.ShowWindow
El tiempo de ejecucin en AutoPlay Media Studio tiene la habilidad de mostrar una ventana de depuracin que puede ser utilizada para mostrar mensajes depurados. Esta ventana existe durante toda la ejecucin de tu aplicacin, pero estar slo visible cuando t le indiques. La sintaxis es:

Debug.ShowWindow(show_window); ...donde show_window es un valor Booleano. Si es true, la ventana de depuracin es mostrada, y si es false, la ventana se ocultar. Por ejemplo: -- muestra la ventana de depuracin Debug.ShowWindow(true); Si llamas este script, la ventana de depuracin aparecer encima de tu aplicacin, pero ninguna otra cosa realmente suceder. Aqu es donde las siguientes acciones Debug vienen.

Debug.Print
Esta accin muestra el texto de tu eleccin en la ventana de depuracin. Por ejemplo, prueba el siguiente script: Debug.ShowWindow(true); for i = 1, 10 do Debug.Print("i = " .. i .. "\r\n"); end La parte \r\n es, de hecho, dos secuencias de escape que estn siendo utilizadas para iniciar una nueva lnea. (Esto es tcnicamente llamado un par cambio de lnea/alimentacin de lnea). Puedes usar \r\n en la ventana de depuracin en el momento que desees insertar una nueva lnea. El script anterior producir la siguiente salida en la ventana de depuracin:

Puedes usar este mtodo para mostrar todo tipo de informacin en la ventana de depuracin. Algunos usos tpicos son mostrar el contenido de una variable de modo que puedas ver qu contiene en tiempo de ejecucin, o mostrar tus propios mensajes de depuracin como inside outer for loop (interno externo para bucle) o foo() function started (foo() funcin iniciada). Tales mensajes crean un rastro como migajas de pan que puedes rastrear para entender qu est sucediendo detrs de las escenas de tu proyecto. Estos pueden ser invaluables a la hora de depurar tus scripts o probar tu ltimo algoritmo.

Debug.GetEventContext
Esta accin es utilizada para obtener una cadena descriptiva acerca del evento que est siendo ejecutado actualmente. Esto puede ser til si defines una funcin en un lugar pero la llamas desde algn otro, y quieres ser capaz de decir desde dnde est siendo llamada la funcin en cualquier momento dado. Por ejemplo, si ejecutas este script desde el evento de un botn en la Pgina 1: Dialog.Message("Event Context", Debug.GetEventContext()); ...vers algo como esto:

Dialog.Message
Esta accin nos ayuda a mostrar mensajes de dilogo. Ya has visto el uso de esta accin lo largo de este documento, y por buenas razones. Esta es una gran accin que tilizamos mucho en nuestros cdigos cuando estamos tratando de seguirle la pista a un roblema.