Subido por David Dubrocq Pérez

guia-de-scripting-en-lua-programacion-en-autoplay-media-studio - Jeshuaben

Anuncio
Introducción
U na de las má
s potentes características de AutoP lay M edia S tudio es su motor de S cript.
Este documento te introduciráen el nuevo ambiente y lenguaje de S cript.
El S cript de AutoP lay es muy simple, con sólo un puñado de conceptos por aprender.
Así es como se mira:
a = 5;
if a < 1 0 then
D
ialog.M essage("¿Adivina qué?","a es menor que 1 0");
end
(Nota: Este script es sólo una demostración.No te preocupes si aún no entiendes nada.)
El ejemplo anterior le asigna un valor a una variable, prueba el contenido de esa
variable y si el valor resulta que es menor de 1 0,utiliza una acción de AutoP lay llamada
“D
ialog.M essage”para mostrarle un mensaje al usuario.
Los programadores novatos así como los codificadores experimentados encontrará
n que
el AutoP lay M edia S tudio tiene un poderoso,flexible y sencillo ambiente de S cript en el
que pueden introducirse.
Un ejemplo Rápido de Script en AutoPlay Media
Studio
Aquí estáun corto tutorial que te muestra cómo introducir un S cript en AutoP lay M edia
S tudio y previsualizar los resultados:
1 . Inicia un nuevo proyecto.
2. Crea un objeto de botón nuevo.
3. En la categoría Actions del panel P ropiedades, haz click en el evento On Click.
U n pequeño botón de edición con tres puntos deberáaparecer enseguida de la
palabra “-- None --”a la derecha.
4.H az click en el botón de edición para abrir el editor de S cript.D
ate cuenta que éste se
abre directamente en la pestaña On Click.
1
5.Escribe el siguiente texto:
D
ialog.M essage("T itle","H ello W orld");
S e deberáver así cuando hayas terminado:
6.H az click en OK para cerrar el editor de S cript.
7. Elige el menú P ublish > P review.
8.U na vez que la aplicación se esté ejecutando,haz click en el botón que creaste.
Esto activaráel evento On Click del botón, así que el S cript que tu introduciste será
ejecutado.S e deberáver el siguiente cuadro de diá
logo aparecer:
Felicidades: Acabas de hacer tu primer S cript.Aunque este es un ejemplo muy sencillo,
muestra lo fá
cil que es hacer que algo suceda en tu aplicación AutoP lay. P uedes usar el
método arriba descrito para probar cualquier S cript que quieras en AutoP lay M edia
S tudio.
2
Conceptos Importantes de un Script
H ay algunas cosas importantes que en general deberá
s saber acerca del S cript de
AutoP lay M edia S tudio antes de comenzar.
El Script es Global
El motor de S cript es global en el ambiente de tiempo de ejecución. Esto significa que
todos los eventos “sabrá
n” acerca de otras variables y funciones declaradas en alguna
otra parte del producto. P or ejemplo, si asignas “myvar = 1 0;” en el evento On S tartup
del proyecto, myvar aún seráigual a 1 0 cuando el próximo evento dé inicio. H ay
métodos en torno a esta modalidad global (ver V ariable S cope), pero está
n por lo
general alineados al motor del S cript.
El Script es Sensible a las Mayúsculas-Minúsculas
El motor de S cript es sensible a las mayúsculas-minúsculas. Esto significa que los
caracteres en mayúscula y minúscula son importantes para tópicos como contraseñas,
nombres de variables y nombres de funciones.
P or ejemplo:
ABC= 1 0;
aBC= 7;
En el script de arriba, ABCy aBCse refieren a dos variables distintas, y pueden tener
diferentes valores. La letra minúscula “a”en “aBC”la hace completamente diferente de
“ABC”en cuanto a lo que AutoP lay le concierne.
El mismo principio también se aplica a los nombres de función.P or ejemplo:
D
ialog.M essage("Q ué tal","H ola M undo");
...se refiere a una función integrada en AutoP lay.S in embargo,
D
IALOG.M essage("Q ué tal","H ola M undo ");
...no seráreconocida como una función integrada, debido a que D
IALOG y D
ialog son
vistos como dos nombres completamente diferentes.
Nota: Es completamente posible tener dos funciones con las mismas letras pero
diferentes en mayúsculas-minúsculas; por ejemplo: GreetU ser y gR EeT U S eR será
n
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 confusión.
3
Comentarios
S e pueden insertar comentarios no ejecutables dentro de tus scripts para explicar y
documentar tu código. En un script, cualquier texto después de dos guiones (--)en una
línea seráignorado.P or ejemplo
-- Asignar 1 0 a la variable abc
abc = 1 0;
...o:
abc = 1 0;-- Asignar 1 0 a abc
Los dos ejemplos de arriba hacen exactamente la misma cosa, los comentarios no
afectan al script de ningún modo.
T ambién puedes crear comentarios multilínea usando --[[ and ]]— al inicio y al final del
comentario:
--[[ Este es
un comentario
multilínea ]]-a = 1 0;
T e sugerimos usar comentarios para explicar tus scripts tanto como sea posible para
hacerlos má
s fá
ciles de entender por ti mismo y por otros.
Delimitando Oraciones
Cada única oración puede estar ya sea en su propia línea y/o separada por un punto y
coma (;).P or ejemplo,todos los scripts siguientes son vá
lidos:
Script 1:
a= 10
M yV ar = a
Script 2:
a = 1 0;M yV ar = a;
Script 3:
a = 1 0;
M yV ar = a;
S in embargo, te recomendamos que finalices todas las oraciones con un punto y coma
(como en los scripts 2 y 3 de arriba).
4
Variables
¿Qué son las Variables?
Las variables son muy importantes en el S cript de Autoplay. Las variables son
simplemente “apodos”o “contenedores”para valores que podrían necesitar modificarse
o reutilizarse después. P or ejemplo, el siguiente script asigna el valor 1 0 a la variable
llamada “cantidad”
cantidad = 1 0;
Nota: D
ecimos que los valores son “asignados a” o “almacenados en” variables. S i
describes una variable como un contenedor que contiene un valor, asignar un valor a
una variable es como “colocar” ese valor dentro del contenedor. P uedes cambiar este
valor en cualquier momento asigná
ndole un valor diferente a la variable;el nuevo valor
simplemente reemplazará al anterior. Esta habilidad para contener información
cambiable es lo que hace a las variables tan útiles.
Aquí te proporcionamos un par de ejemplos demostrando cómo puedes operar sobre la
variable “cantidad”
cantidad = 1 0;
cantidad = cantidad + 20;
D
ialog.M essage("V alor",cantidad);
Esto almacena 1 0 en la variable llamada “cantidad”, luego añade 20 a ese valor, y
finalmente hace que un cuadro de diá
logo aparezca con el valor actual (el cual es ahora
el número 30)en él.
T ambién puedes asignar una variable a otra:
a = 1 0;
b = a;
D
ialog.M essage("V alor",b);
Esto haráque un cuadro de diá
logo aparezca con el número 1 0 en él.La línea “b = a;”le
asigna el valor de “a”(el cual es 1 0)a “b”.
Campo de Acción de las Variables
Como se había mencionado antes, todas las variables en AutoP lay M edia S tudio 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áaún ese valor cuando el
siguiente script sea ejecutado.
P or ejemplo,si introduces el siguiente script:
5
foo = 1 0;
… dentro del evento On Open de la pá
gina actual,y luego introduces:
D
ialog.M essage("El valor es:",foo);
… dentro del evento On Click de un objeto de botón,el segundo script utilizaráel valor
que le fue asignado a “foo” en el primer script. Como resultado, cuando el objeto de
botón es clickeado,un cuadro de diá
logo aparecerácon el número 1 0 en él.
D
ate cuenta que el orden de ejecución 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 pá
gina es
accionado antes que el evento On Click del botón,así que el valor 1 0 ya estáasignado a
“foo”cuando el script del evento On Click es ejecutado.
Variables Locales
La naturaleza global del motor del S cript significa que una variable retiene su valor a lo
largo y ancho de todo tu proyecto. P uedes, sin embargo, hacer variables que sean noglobales usando la palabra clave especial “local”. P oner la palabra “local”antes de una
variable asignada crea una variable que es local en el script o función actual.
P or ejemplo,digamos que tienes los siguientes tres scripts en el mismo proyecto:
Script 1:
-- asigna 1 0 a x
x = 1 0;
Script 2:
local x = 500;
D
ialog.M essage("El valor local de x es:",x);
x = 250;-- esto cambia la x local,no la global
D
ialog.M essage("El valor local de x es:",x);
Script 3:
-- muestra el valor global de x
D
ialog.M essage("El valor global de x es:",x);
Asumamos que estos tres scripts son ejecutados uno después de otro. El primer script le
da a x el valor de 1 0. P uesto que todas las variables son globales por defecto, x tendrá
este valor dentro de todos los otros scripts también. El segundo script hace una
asignación local para x, dá
ndole el valor de 500 (pero sólo dentro de ese script). S i
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.
6
(Esto nos recuerda aquellas películas donde los ladrones del banco ponen una
fotografía enfrente de las cámaras de seguridad de modo que los guardias no vean que
la bóveda está siendo vaciada. Sólo en este caso, es como los ladrones del banco crean
una intacta bóveda nueva en operación, como la original, y entonces la desmantelan y
luego huyen tranquilamente)
Cuando se manda mostrar el contenido de x, la primera acción interna D
ialog.M essage
del script #2 mostrará500, puesto que es el valor local de x cuando la acción es
ejecutada. La próxima línea 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 aún 1 0.
(Nota: P ara que se muestren los cuadros de diá
logo como se describe arriba, deberá
s
introducir el S cript #3 en un evento diferente al del S cript #2)
Nominación de Variables
Los nombres de las variables pueden ser inventados de cualquier combinación de letras,
dígitos y subrayados, siempre y cuando no comiencen con un número y no entren en
conflicto con palabras clave reservadas.
Ejemplos válidos para nombres de variables:
a
strName
_M y_V ariable
data1
data_1 _23
index
bR eset
nCount
Ejemplos no válidos para nombres de variables:
1
1 data
% M yV alue%
$strD
ata
for
local
_FirstName+ LastName_
U ser Name
Cá
lido (no son vá
lidas palabras con acento,diéresis,ni caracteres especiales)
Palabras Clave Reservadas
Las siguientes palabras está
n reservadas y no pueden ser utilizadas para nombres de
variables o de funciones:
7
and
end
in
repeat
until
break
false
local
return
while
do
for
nil
table
else
function
not
then
elseif
if
or
true
Tipos y Valores
El lenguaje de S cript de Autoplay es diná
micamente escrito. No hay definiciones de
tipo (má
s bien,cada valor lleva su propio tipo).
Esto significa que no tienes que declarar que una variable sea de cierto tipo antes de
usarla. P or ejemplo, en C+ + , si quieres usar un número, primero tienes que declarar el
tipo de variable y luego asignarle un valor:
int j;
j = 1 0;
El ejemplo C+ + de arriba declara a j como un entero,y luego le asigna un valor de 1 0.
Como hemos visto, en AutoP lay 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.P or ejemplo:
j = 1 0;
… esto crea automá
ticamente la variable llamada “j”y le asigna el valor de 1 0. Aunque
este valor tiene un tipo (un número), la variable en sí misma es aún sin tipo. Esto
significa que puedes regresar y asignarle un tipo diferente de valor a “j”,como esto:
j = "H ello";
Esto reemplaza al número 1 0 que es almacenado en “j”con la cadena “H ello”.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 sólo almacena lo que tú le asignas.
H ay seis tipos bá
sicos de datos en Autoplay: number (número), string (cadena), nil
(nulo), boolean (booleano), function (función)y table (tabla). Las secciones de abajo te
explicará
n cada tipo de datos con má
s detalle.
Number (Número)
U n número es exactamente eso: un valor numérico. El tipo de número representa
números reales, especialmente valores de punto flotante de doble precisión. No hay
distinción entre números enteros y de punto flotante (también conocidos como
“fracciones”)… todos ellos son sólo “números”. Aquí tenemos algunos ejemplos
vá
lidos de números:
4
4.
.4
0.4
4.57e-3
8
0.3e1 2
String (Cadena)
U na cadena es simplemente una secuencia de caracteres. P or ejemplo, “Joe2” es una
cadena de cuatro caracteres, comenzando con una mayúscula “J” y terminando con el
número “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 exóticos, tales como
símbolos de cambios de línea (retornos de carro) y símbolos de saltos de línea. D
e
hecho, las cadenas pueden contener una combinación de caracteres AS CII 8.bit vá
lidos,
incluyendo caracteres invalidados (“\0”).AutoP lay automá
ticamente maneja la memoria
de la cadena, de modo que nunca te preocupará
s por memoria no localizada o
deslocalizada por las cadenas.
Las cadenas pueden ser utilizadas de lo má
s intuitiva y naturalmente. D
eberá
n ser
delimitadas por comillas simples o dobles.Estos son unos ejemplos del uso de cadenas:
Name = "Joe Blow";
D
ialog.M essage("T ítulo","H ola,cómo está
s?");
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. P ara cualquier tipo de
comillas que uses puedes incluirle el otro tipo en su interior de la cadena sin que afecte.
P or ejemplo:
dobles = "H ow'
s that again?";
simples = '
S he said "T alk to the hand,"and I was all like "D
ude!"'
;
S i usamos comillas dobles para la segunda línea,deberáverse así:
evadidas = "S he said \"T alk to the hand,\"and I was all like \"D
ude!\"";
Normalmente, el motor de S cript interpreta las comillas dobles como una marca del
inicio o fin de una cadena. P ara incluir comillas dobles dentro de una cadena con
comillas dobles, necesitas escabullirlas con barras inversas. Esto le indica al motor de
S cript que quieres incluir un cará
cter de cita literal en la cadena.
La barra inversa y comilla (\") es conocida como una escape sequence (secuencia de
escape). U na secuencia de escape es una secuencia especial de caracteres que son
convertidos o “traducidos”en algo má
s por el motor de S cript.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
\b
\f
\n
\r
-
bell
backspace (retroceder un espacio)
form feed (avance de pá
gina)
newline (nueva línea)
carriage return (retorno de línea)
9
\t \v \\ \" \' \[ \] -
horizontal tab (tabulador horizontal)
vertical tab (tabulador vertical)
backslash (barra inversa)
quotation mark (marca de cita literal)
apostrophe (apóstrofe)
left square bracket (corchete izquierdo)
right square bracket (corchete derecho)
Así, por ejemplo, si quieres representar tres líneas de texto en una sola cadena, deberá
s
utilizar lo siguiente:
Lineas = "Línea uno.\nLínea dos.\nLínea tres";
D
ialog.M essage("Aquí estála cadena ",Lineas);
Esto le asigna una cadena a la variable nombrada Lineas, y utiliza la secuencia de
escape de “nueva línea” para iniciar un nuevo renglón después de cada oración. La
función D
ialog.M essage despliega el contenido de la variable Lineas en un cuadro de
diá
logo,como éste:
Nota: S i eres muy observador, habrá
s 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 “Línea”. R ecuerda que el nombre de una variable no
deberáestar acentuado porque de lo contrario marcaráun error de S cript debido a que lo
interpreta como una variable no vá
lida;por otro lado el contenido de las cadenas puede
incluir cualquier cará
cter por muy especial que éste sea.
Otro ejemplo común es cuando quieres representar una ruta de archivo tal como
C:\M i Carpeta\M is D
atos.txt. S ólo necesitas acordarte de la secuencia de escape de
barra inversa:
M iR uta = "C:\\M i Carpeta\\M is D
atos.txt";
Cada barra inversa doble representa una barra inversa simple cuando es utilizada dentro
de una cadena.
10
S i conoces el código AS CII, puedes usar un cará
cter de barra inversa seguido por un
número de hasta tres dígitos para representar cualquier cará
cter por su valor AS CII. P or
ejemplo, el valor AS CII para un cará
cter de nueva línea es 1 0, así que las dos líneas
mostradas a continuación hacen exactamente la misma cosa:
Lineas = "Línea uno.\nLínea dos.\nLínea tres";
Lineas = "Línea uno.\1 0Línea dos.\1 0Línea tres";
S in embargo, no necesitará
s usar este formato con mucha frecuencia, si acaso alguna
vez.
P uedes también definir cadenas en líneas múltiples usando corchetes dobles ([[ and ]]).
U na cadena entre corchetes dobles no necesita ningún cará
cter de secuencia de escape.
Los corchetes dobles te permiten introducir caracteres especiales como barras inversas,
comillas y nuevas líneas directamente en el interior de la cadena.P or ejemplo:
Lineas = [[Línea uno.
Línea dos.
Línea tres.]];
es equivalente a:
Lineas = "Línea uno.\nLínea dos.\nLínea 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
S cript proporciona conversión automá
tica entre números y cadenas en tiempo de
ejecución. S i una operación numérica es aplicada a una cadena, el motor trata de
convertir la cadena a un número para la operación. P or supuesto, esto sólo tendráéxito
si la cadena contiene algo que pueda ser interpretado como un número.
P or ejemplo,las siguientes dos líneas son vá
lidas:
a = "1 0"+ 1 ;-- El resultado es 1 1
b = "33"* 2;-- El resultado es 66
S in embargo,las siguientes dos líneas no te darían la misma conversión en el resultado:
a = "1 0+ 1 ";-- El resultado es la cadena "1 0+ 1 "
b = "hola"+ 1 ;-- ER R OR ,no se puede convertir "hola"en un número
P ara má
s información del trabajo con cadenas, dirígete al tema “Manipulación de
Cadenas”.
Nil (Nulo)
Nil es un tipo especial de valor. Bá
sicamente representa la ausencia de cualquier otro
tipo de valor.
11
P uedes asignar nil a una variable sólo como cualquier otro valor. D
ate 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.
T ambién deberáser introducida con todas las letras en minúscula.
Nil siempre evaluarácomo falso cuando sea usada en una condición
b = nil;
if b then
-- Cualquier línea de script aquí
-- no seráejecutada
end
T ambién puede ser usada para “borrar”una variable
y = "Joe Blow";
y = nil;
En el ejemplo de arriba, “y” no contendrápor má
s tiempo un valor después de la
segunda línea.
Boolean (Booleano)
Los tipos de variables Boolean (o Booleanas) pueden tener uno de estos dos valores;
true (verdadero) o false (falso). P ueden ser usadas en condiciones y para ejecutar
operaciones lógicas Booleanas.P or 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 declaración if.S imilarmente:
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 declaración if necesita que tanto “a” como “b” sean true (verdaderas)para
que las líneas dentro de ella sean ejecutadas. En este caso, eso no sucederáporque “b”
ha sido establecido como false (falso).
Function (Función)
El motor de S cript te permite definir tus propias funciones (o sub-rutinas), las cuales
esencialmente son pequeñas piezas de script que pueden ser ejecutadas a petición. Cada
12
función tiene un nombre, el cual es utilizado para identificar la función. D
e hecho
puedes usar el nombre de esa función como un tipo especial de valor para almacenar
una “referencia” a esa función en una variable, o pasarla a otra función. Esta clase de
referencia es del tipo function.
P ara má
s información sobre funciones,revisa el tema Funciones.
Table (Tabla)
Las tablas son un método 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 sólo con números,sino con cualquier tipo de valor (incluyendo
cadenas).
Aquí está
n unos cuantos ejemplos (se analizan con má
s detalle las tablas en el tema
Tablas):
Ejemplo 1:
muchachos = {"Adá
n","Bruno","D
aniel"};
D
ialog.M essage("S egundo nombre en la lista",muchachos[2]);
Esto mostraráun cuadro de diá
logo con la palabra “Bruno”en él.
Ejemplo 2:
t = {};
t.Nombre = "M iguel";
t.Apellido = "R amírez";
t.Ocupacion = "Electricista";
D
ialog.M essage(t.Nombre,t.Ocupacion);
Esto mostraráel siguiente cuadro de diá
logo:
13
T ambién puedes asignar tablas a otras variables.P or ejemplo:
tabla_uno = {};
tabla_uno.Nombre = "M iguel";
tabla_uno.Apellido = "R amírez";
tabla_uno.Ocupacion = "Electricista";
tabla_dos = tabla_uno;
ocupacion = tabla_dos.Ocupacion;
D
ialog.M essage(b.Nombre,ocupacion);
Las tablas pueden ser indexadas usando notación de arreglo (mi_tabla[1 ]), o por
notación de punto si no se indexópor números (mi_tabla.Apellido).
D
ate cuenta que cuando le asignas una tabla a otra,como en la siguiente línea:
tabla_dos = tabla_uno;
… de hecho esto no copia la tabla_uno dentro de la tabla_dos. M á
s 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 dirección 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, está
s copiando la dirección, y no los datos
actuales. Esencialmente está
s haciendo que las dos variables se “enfoquen” a la misma
tabla de datos.
P ara copiar el contenido de una tabla, necesitas crear una nueva tabla y entonces copiar
todos los datos sobre un elemento a la vez.
P ara má
s información del copiado de tablas,dirígete al tema Tablas)
Variable de Asignación
Las variables pueden tener nuevos valores asignados a ellas usando el operador de
asignación (= ). Esto incluye el copiar el valor de una variable dentro de otra. P or
ejemplo:
a = 1 0;
b = "Estoy feliz";
c = b;
Es interesante notar que el motor de S cript soporta asignación múltiple:
a,b = 1 ,2;
D
entro del script de arriba, la variable “a” contiene el número 1 y la variable “b”
contiene el número 2.
Las tablas y las funciones son algo así como un caso especial: cuando usas el operador
de asignación (= ) en una tabla o función, creas un “sobrenombre” que se refiere a la
14
misma tabla o función 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).
15
Expresiones y Operadores
U na expresión es cualquier cosa que evalúe a un valor. Esta puede incluir un valor
simple tal como “6”o un valor compuesto construido con operadores tal como “1 + 3”.
P uedes usar paréntesis para “agrupar” expresiones y controlar el orden en el cual será
n
evaluadas.P or ejemplo,todas las siguientes líneas evaluará
n el mismo valor:
a=
a=
a=
a=
1 0;
(5 * 1 )* 2;
1 00 /1 0;
1 00 /(2 * 5);
Operadores Aritméticos
Los Operadores Aritméticos son utilizados para ejecutar operaciones matemá
ticas en
números.Los siguientes operadores matemá
ticos son soportados:
+
*
/
unary -
(adición)
(substracción)
(multiplicación)
(división)
(negativo)
Aquí tienes algunos ejemplos:
a = 5 + 2;
b = a * 1 00;
veintitrés por ciento = 23 /1 00;
neg = -29;
pos = -neg;
Operadores de Relación
Los Operadores de R elación te permiten comparar la manera en que un valor se
relaciona con otro.Los siguientes operadores de relación son soportados:
>
<
<=
>=
~=
==
(mayor que)
(menor que)
(menor o igual que)
(mayor o igual que)
(no es igual a)
(igual a)
T odos los operadores de relación pueden ser aplicados a cualquier par de números o par
de cadenas. T odos los demá
s valores sólo pueden usar el operador = = para comparar si
son iguales.
16
Los operadores de relación regresan valores Booleanos (true (verdadero)o false (falso)).
P or ejemplo:
1 0 > 20;-- da como resultado un false
a = 1 0;
a > 300;-- false
(3 * 200)> 500;-- true
"Brett"~= "Lorne"-- true
U n punto importante a mencionar es que los operadores == y ~= hacen una prueba de
igualdad completa, lo cual significa que cualquier comparación de cadena hecha con
dichos operadores es un caso sensible a mayúsculas-minúsculas.P or ejemplo:
"Jojoba"= = "Jojoba";-- true
"Gato"= = "gato";-- false
"M e gusta mucho"= = "M e gusta M U CH O";-- false
"feliz"~= "FeLiZ ";-- true
Operadores Lógicos
Los Operadores Lógicos son utilizados para ejecutar operaciones Booleanas en valores
Booleanos.Los siguientes operadores lógicos son soportados:
and
or
not
(solo es true ambos valores son true)
(true si cualquiera de los valores es true)
(regresa lo opuesto del valor)
P or ejemplo:
a=
b=
c=
d=
e=
true;
false;
a y b;-- false
a y nil;-- false
not b;-- true
D
ate cuenta que solamente nil y false son consideramos como false, y todos los demá
s
valores son true.
P or ejemplo:
soyinvisible = nil;
if soyinvisible then
-- cualquier código puesto aquí no se ejecutará
-- porque soyinvisible es considerado false
D
ialog.M essage("No puedes verme!","S oy invisible!!!!");
end
17
if "Brett"then
-- cualquier código puesto aquí sí se ejecutará
,porque sólo nil y false
-- son considerados false...cualquier otra cosa,incluyendo cadenas,
-- es considerada true
D
ialog.M essage("¿Y las cadenas?","Las cadenas son true.");
end
Encadenamiento
En el script de AutoP lay, el operador de encadenamiento es dos puntos (..). Este es
usado para combinar dos o má
s cadenas juntas. No tienes que poner espacios antes y
después de los dos puntos,pero puedes hacerlo si quieres.
P or ejemplo:
nombre = "José".."Bonilla";-- asigna "José Bonilla"a nombre
b = nombre .."es número "..1 ;-- asigna "José Bonilla es número 1 "a b
Prioridad de Operadores
S e dice que los operadores tienen prioridad, lo cual es una forma de describir las reglas
que determinan cuá
les operadores se ejecutan primero en una serie de expresiones. U n
simple ejemplo sería la expresión 1 + 2 * 3. El operador de multiplicación (*) tiene
prioridad má
s alta que el operador de adición (+ ), de modo que esta expresión es
equivalente a 1 + (2 * 3). En otras palabras, la expresión 2 * 3 es ejecutada primero, y
luego 1 + 6 se ejecuta,resultando un valor final de 7.
S e puede pasar por alto el orden natural de prioridad con el uso de paréntesis. P or
ejemplo, la expresión (1 + 2) * 3 da como resultado el 9. Los paréntesis hacen que la
sub-expresión entera (1 + 2) sea el valor izquierdo del operador de multiplicación (*).
Esencialmente, la sub-expresión 1 + 2 es evaluada primero, y el resultado es luego
usado en la expresión 3 * 3.
La prioridad de operadores tiene el siguiente orden,partiendo de la prioridad má
s baja a
la má
s alta:
and
<
..
+
*
not
^
or
>
<=
>=
~=
==
/
- (unary)
S e dice también que los operadores tienen asociatividad, que es una forma de describir
cuá
les expresiones son ejecutadas primero cuando los operadores tienen igual prioridad.
En el motor de S cript, todos los operadores binarios son asociativos izquierdos, esto
quiere decir que cuando dos operadores tienen la misma prioridad, la operación de la
18
izquierda se ejecuta primero.La excepción es el operador de exponenciación (^),el cual
es asociativo derecho
Cuando tengas dudas, siempre puedes usar paréntesis explícitos para controlar la
prioridad.P or ejemplo:
a + 1 < b/2 + 1
...es lo mismo que:
(a + 1 )< ((b/2)+ 1 )
...igualmente,puedes usar paréntesis para cambiar el orden de los cá
lculos:
a + 1 < b/(2 + 1 )
En este último ejemplo, en vez de que 1 sea añadido a la mitad de b, b es dividido entre
3.
19
Estructuras de Control
El motor de S cript soporta las siguientes estructuras de control: if, while, repeat y for.
If
U na declaración if evalúa su condición y entonces ejecuta la parte “then” sólo si la
condición es true. U na declaración if es finalizada por la palabra clave “end”. La
sintaxis bá
sica es:
if condicion then
haz algo aquí
end
P or ejemplo:
x = 50;
if x > 1 0 then
D
ialog.M essage("resultado","x es má
s grande que 1 0");
end
y = 3;
if ((35 * y)< 1 00)then
D
ialog.M essage("","y veces 35 es menor que 1 00");
end
En el script de arriba, solamente el primer cuadro de diá
logo serámostrado, porque la
segunda condición if no es true… 35 veces 3 es 1 05,pero 1 05 no es menor que 1 00.
T ambién puedes usar else y elseif para añadir má
s “ramificaciones”a la declaración if:
x = 5;
if x > 1 0 then
D
ialog.M essage("","x es mayor que 1 0");
else
D
ialog.M essage("","x es menor o igual a 1 0");
end
En este ejemplo, el segundo cuadro de diá
logo deberámostrarse porque 5 no es mayor
que 1 0.
V eamos un último ejemplo:
x = 5;
if x = = 1 0 then
D
ialog.M essage("","x is exactamente 1 0");
elseif x = = 1 1 then
D
ialog.M essage("","x is exactamente 1 1 ");
20
elseif x = = 1 2 then
D
ialog.M essage("","x is exactamente 1 2");
else
D
ialog.M essage("","x no es 1 0,1 1 o 1 2");
end
En este ejemplo,el último cuadro de diá
logo serámostrado debido a que x no es igual a
1 0,1 1 o 1 2.
While
La declaración while es utilizada para ejecutar el mismo “paquete” de script una y otra
vez hasta que una condición sea encontrada. Al igual que las declaraciones if, las
declaraciones while son finalizadas con la palabra clave “end”.La sintaxis bá
sica es:
while condicion do
haz algo aquí
end
La condición debe ser true para que las acciones dentro de la declaración while (la parte
“haz algo aquí”) sea ejecutada. La declaración while continuarárepitiéndose hasta que
esta condición sea true. Así es como trabaja:
S i la condición es true, todas las acciones entre el “while” y su correspondiente “end”
será
n ejecutadas. Cuando el “end” es alcanzado, la condición seráreevaluada, y si ésta
aún es true, las acciones entre “while”y “end”será
n ejecutadas de nuevo. Las acciones
continuará
n en ciclo hasta que la condición sea evaluada como false.
P or ejemplo:
a= 1;
while a < 1 0 do
a= a+ 1;
end
En el ejemplo de arriba,la línea “a = a + 1 ;”seráejecutada 9 veces.
P uedes romper un ciclo while en el momento que quieras usando la palabra clave
“break”.P or ejemplo:
count = 1 ;
while count < 1 00 do
count = count + 1 ;
if count = = 50 then
break;
end
end
Aunque la declaración while estádispuesta a contar de 1 a 99, la declaración if causará
que este ciclo termine en el momento que la cuenta alcance 50
21
Repeat
La declaración repeat es similar a la declaración while, excepto que la condición es
comprobada al final de la estructura en lugar de verificarse al inicio. La sintaxis bá
sica
es:
repeat
haz algo aquí
until condicion
P or ejemplo:
i = 1;
repeat
i = i + 1;
until i > 1 0
Esto es similar a uno de los ciclos while que se explicó arriba, pero esta vez, el ciclo es
ejecutado 1 0 veces. La parte “i = i + 1 ;” es ejecutada antes de que la condición
determine que i es ahora má
s grande que 1 0.
P uedes interrumpir este ciclo en el momento que quieras usando la palabra clave
“break”.P or ejemplo:
count = 1 ;
repeat
count = count + 1 ;
if count = = 50 then
break;
end
until count > 1 00
U na vez má
s,esto detendráel ciclo en el momento en que la cuenta sea igual a 50.
For
La declaración for es utilizada para repetir un bloque de script un determinado número
de veces.La sintaxis bá
sica es:
for variable = start,end,step do
do something here
end
La variable puede ser nombrada como desees. Esta declaración for es utilizada para
“contar” el número de paseos a lo largo del ciclo for. Comienza en el valor start que
especifiques, y luego cambia por la cantidad en step después de cada paseo a través del
ciclo. En otras palabras, el step es añadido al valor en la variable después de que las
líneas entre for y end son ejecutadas. S i el resultado es menor o igual a el valor end, el
ciclo continúa desde el principio.
22
P or ejemplo:
-- Este ciclo cuenta de 1 a 1 0:
for x = 1 ,1 0 do
D
ialog.M essage("Number",x);
end
El ejemplo anterior despliega 1 0 mensajes de diá
logo en fila, contando de 1 a 1 0. D
ate
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 atrá
s:
-- Este ciclo cuenta de 1 0 a 1 :
for x = 1 0,1 ,-1 do
D
ialog.M essage("Número",x);
end
Este ejemplo mostrará1 0 mensajes de diá
logo en fila, contando hacia atrá
s desde 1 0 y
retrocediendo hasta 1 .
P uedes interrumpir un ciclo for en el momento que quieras usando la palabra clave
“break”
for i = 1 ,1 00 do
if count = = 50 then
break;
end
end
D
e nuevo,esto finalizaráel ciclo en el momento que la cuenta sea igual a 50.
H ay también una variación en el ciclo for que opera en tablas. P ara má
s información
sobre esto,ve a la sección El Uso de For para Enumerar Tablas.
23
Tablas (Arreglos)
Las tablas son muy útiles. P ueden ser utilizadas para almacenar cualquier tipo de valor,
incluyendo funciones o incluso otras tablas.
Creación de Tablas
Generalmente hay dos formas de crear una tabla desde cero.El primer método utiliza
llaves para especificar una lista de valores:
mi_tabla = {"manzana","naranja","durazno"};
tabla_asociativa = {fruta= "manzana",vegetal= "zanahoria"}
El segundo método es crear una tabla en blanco y luego añadir 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 información 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 notación de arreglo
o notación de punto. La notación de arreglo es utilizada típicamente con arreglos
numéricos, los cuales son simplemente tablas donde todas las claves son números. La
notación de punto es usada normalmente con arreglos asociativos, los cuales son tablas
donde las claves son cadenas.
Aquí te mostramos un ejemplo de notación de arreglo:
t = { "uno","dos","tres"};
D
ialog.M essage("El elemento uno contiene:",t[1 ]);
Y aquí un ejemplo de notación de punto:
t = { first= "uno",second= "dos",third= "tres"};
D
ialog.M essage("El elemento '
first'contiene:",t.first);
24
Arreglos Numéricos:
U no de los usos má
s comunes en las tablas son los arreglos.U n arreglo es una colección
de valores que está
n indexados por claves numéricas.En el motor de S cript,los arreglos
numéricos está
n basados en 1 .Es decir,que comienzan a indexarse en 1 .
Aquí está
n algunos ejemplos del uso de Arreglos Numéricos:
Ejemplo 1:
miArreglo = {255,0,255};
D
ialog.M essage("P rimer Número",miArreglo [1 ]);
Esto desplegaráun mensaje de diá
logo conteniendo el número “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"};
D
ialog.M essage("S éptima Letra",alfabeto[7]);
Esto desplegaráun mensaje de diá
logo conteniendo la letra “g.”
Ejemplo 3:
miArreglo = {};
miArreglo[1 ] = "Opción U no";
miArreglo[2] = "Opción D
os";
miArreglo[3] = "Opción T res";
Esto es exactamente lo mismo que lo siguiente:
miArreglo = {"Opción U no","Opción D
os","Opción T res"};
Arreglos Asociativos
Los Arreglos Asociativos son lo mismo que los Arreglos Numéricos,excepto que en los
primeros los pará
metros pueden ser números,cadenas o incluso funciones.
Aquí estáun ejemplo de un arreglo asociativo que usa un apellido como un pará
metro,y
un nombre como el valor
arrNombres = {Cuevas= "Juan",
Cardona= "R ogelio",
Contreras= "José",
H errera= "Christian",
H itchcock= "Alfredo"};
D
ialog.M essage("El nombre de Cuevas",arrNombres.Cuevas);
25
El mensaje de diá
logo 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 número de empleado:
Empleados = {};-- Construye una tabla vacía para los números de empleado
-- almacena información de cada empleado en su propia tabla
Empleado1 = {Nombre= "Juan Cuevas",Nacimiento= "07/02/82"};
Empleado2 = {Nombre= "R ogelio Cardona",Nacimiento= "1 2/25/79"};
-- almacena la tabla de información de cada empleado
-- en el número apropiado de la tabla de empleados
Empleados[1 00099] = Empleado1 ;
Empleados[1 37637]= Empleado2;
-- ahora la escritura "Empleados[1 00099]"es lo mismo que la escritura "Empleado1 "
D
ialog.M essage("Fecha de Nacimiento",Empleados[1 00099].Nacimiento);
El mensaje de diá
logo resultante tendráeste aspecto:
El Uso de For para Enumerar Tablas
H ay una versión especial de la declaración for que te permite enumerar el contenido de
un arreglo rá
pida y fá
cilmente.La sintaxis es:
26
for index,value in table do
operate on index and value
end
P or ejemplo:
mitabla = {"U no","D
os","T res"};
-- despliega un mensaje para cada artículo de la tabla
for j,k in mitabla do
D
ialog.M essage("Artículo",j .."= "..k);
end
El resultado será
n tres mensajes de diá
logo en fila, uno por cada elemento en mitabla,
como estos:
Acuérdate de la declaración for de arriba, porque es una manera rá
pida y fá
cil de
inspeccionar los valores en una tabla. S i sólo quieres los pará
metros de una tabla,
puedes omitir la parte value de la declaración for:
a = {U no= 1 ,D
os= 2,T res= 3};
for k in a do
D
ialog.M essage("Indice de T abla",k);
end
El script de arriba mostrarátres mensajes de diá
logo en fila,con el texto “U no”,“T res”,
y luego “D
os”.
¿Cómo? ¿P or qué los elementos de la tabla no está
n es orden? La razón de esto es que
internamente el motor de S cript 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 añadas, a menos que uses un arreglo numérico (por
ejemplo una tabla indexada con números del 1 al que quieras).
27
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 asignación para copiar el contenido de una
tabla dentro de otra. Esto es porque el nombre de la tabla de hecho se refiere a una
dirección en memoria donde los datos dentro de la tabla son almacenados. S i tratas de
copiar una tabla en otra usando el operador de asignación, acabará
s copiando la
dirección,y no los datos actuales.
P or ejemplo, si quisieras copiar una tabla, y luego modificar la copia, tendrías que
intentar algo como esto:
tabla_uno = { color= "R ojo",temperatura= "Caliente"};
-- crear una copia
tabla_dos = tabla_uno;
-- modificar la copia
tabla_dos.temperatura = "Fría";
D
ialog.M essage("T emperatura T abla U no:",tabla_uno.temperatura);
D
ialog.M essage("T emperatura T abla D
os:",tabla_dos.temperatura);
S i ejecutas este script,verá
s los siguientes dos diá
logos:
Espera un minuto… el cambio del elemento “temperatura” en tabla_dos también lo
cambióen tabla_uno.¿P or qué cambiaron ambos?
La respuesta es simple: porque las dos son de hecho la misma tabla.
Internamente, el nombre de una tabla sólo se refiere a una ubicación en memoria.
Cuando tabla_uno es creada,una porción de memoria es dejada aparte para mantener su
contenido. La ubicación (o “dirección”) de esta memoria es la que es asignada a la
variable llamada tabla_uno.
Asignar tabla_uno a tabla_dos sólo copia la dirección de memoria,no la memoria actual
en sí misma.
28
Es como anotar el domicilio de una biblioteca en un pedazo de papel, y luego darle ese
papel a tu amigo. T ú no está
s dá
ndole la biblioteca entera, con estantes de libros y
todo… sólo le proporcionaste la ubicación donde pueda ser encontrada.
S i quisieras actualizar una copia de la biblioteca, tendrías que crear un nuevo edificio,
fotocopiar cada libro individualmente, y luego almacenar las fotocopias en la nueva
ubicación.
Eso es demasiado,como lo es con tablas también.P ara 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 declaración for hace esto realmente fá
cil de hacer. P or ejemplo,
aquí estáuna versión modificada de nuestro má
s reciente ejemplo, que crea una copia
“verdadera”de tabla_uno.
tabla_uno = { color= "R ojo",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 = "Fría";
D
ialog.M essage("T emperatura T abla U no:",tabla_uno.temperatura);
D
ialog.M essage("T emperatura T abla D
os:",tabla_dos.temperatura);
Esta vez, los diá
logos muestran que la modificación de tabla_dos no afecta para nada a
tabla_uno:
Funciones en Tablas
H ay un buen número de Funciones de T abla integradas a tu disposición, las cuales
puedes utilizar para hacer tales cosas como insertar, remover y cuantificar elementos
dentro de una tabla. P ara má
s información sobre las Funciones de T abla, por favor
dirígete a Program Reference / Actions / Table en la Ayuda en Línea.
29
Funciones
P or mucho, la má
s estupenda y poderosa característica del motor de S cript son las
Funciones. Y a has visto muchas de ellas utilizadas a lo largo de este documento, tales
como “D
ialog.M essage.”. Las Funciones simplemente son porciones de script que
puedes definir,nombrar y luego llamar desde donde quieras.
Aunque hay muchas funciones integradas en AutoP lay, puedes tener las tuyas propias
que se ajusten a la medida de tus necesidades. En general, las funciones está
n 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 S cript que lo
que sigue es una definición de función. La function_name es simplemente un nombre
único para tu función. Los arguments son pará
metros (o valores)que será
n transferidos
a la función cada vez que sea llamada. U na función puede recibir cualquier número de
argumentos desde 0 a infinito (bueno, no hasta infinito, pero casi). La palabra clave
“return”le dice a la función que devuelva uno o má
s valores al script que la llamó.
La forma má
s fá
cil de aprender acerca de las funciones es mirar algunos ejemplos. En
este primer ejemplo, haremos una simple función que muestre un cuadro de mensaje.
Esta no toma ningún argumento y no devuelve nada.
function H elloW orld()
D
ialog.M essage("Bienvenido","H ola M undo");
end
D
ate cuenta que si pones el script de arriba dentro de un evento y lo previsualizas en tu
aplicación, nada sucede. Bueno, esto es verdad y no lo es. Es verdad que nada visible
sucede pero lo má
gico es que tú no puedes verlo. Cuando el evento es lanzado y el
script function es ejecutado, la función llamada “H elloW orld” viene a ser parte del
motor de S cript.Esto significa que estáahora disponible para el resto de la aplicación en
cualquier otro script.
Esto plantea un punto importante acerca del S cript en AutoP lay M edia S tudio. Cuando
se construye una función, la función no se “adentra”en el motor sino hasta que el script
es ejecutado. Lo cual significa que si defines H elloW orld()en el evento On Click de un
botón,pero ese evento nunca es activado (debido a que el usuario no hace click sobre el
botón), entonces la función H elloW orld() nunca existirá
. Es decir, no será
s 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. (P ara acceder al script global, elige el menú P roject > Global
Functions).
30
Ahora, regresemos a cosas buenas. Añadamos una línea para llamar a la función
verdaderamente:
function H elloW orld()
D
ialog.M essage("Bienvenido","H ola M undo");
end
H elloW orld();
La línea “H elloW orld();” le avisa al motor de S cript para que “ejecute la función
llamada H elloW orld”. Cuando esa línea sea ejecutada, verá
s un mensaje de bienvenida
con el texto “H ola M undo”en él.
Argumentos de Función
Llevemos esto un poco má
s alláy digá
mosle al cuadro de diá
logo cuá
l texto mostrar al
añadir un argumento a la función
function H elloW orld(M ensaje)
D
ialog.M essage("Bienvenido",M ensaje);
end
H elloW orld("Esto es un argumento");
Ahora el cuadro de diá
logo muestra el texto que fue “pasado”a la función.
En la definición de función, “M ensaje” es una variable que automá
ticamente recibe
cualquier argumento que sea pasado a la función. En la llamada de función, pasamos la
cadena "Esto es un argumento" como el primer (y único) argumento para la función
H elloW orld.
Aquí estáun ejemplo del uso de argumentos múltiples:
function H elloW orld(T itulo,M ensaje)
D
ialog.M essage(T itulo,M ensaje);
end
H elloW orld("Este es el argumento uno","Este es el argumento dos");
H elloW orld("Bienvenido","H ola");
Esta vez, la definición de función utiliza dos variables, una para cada uno de sus
argumentos… y cada llamada de función le pasa dos cadenas a la función H elloW orld
Nota que cambiando el contenido de esas cadenas, puedes mandar argumentos
diferentes a la función,y lograr distintos resultados.
31
Valores Devueltos (o de Retorno)
El siguiente paso es hacer que la función devuelva valores al llamado del script.H e aquí
una función que acepta un número como su único argumento, y luego devuelve una
cadena conteniendo todos los números desde el uno hasta ese número.
function Count(n)
-- comenzar con una cadena de retorno en blanco
R eturnS tring = "";
for num = 1 ,n do
-- añadir el número actual (num)al final de la cadena de retorno
R eturnS tring = R eturnS tring..num;
-- si éste no es el ultimo número,entonces añadir una coma y un espacio
-- para separar los números un poco en la cadena de retorno
if (num ~= n)then
R eturnS tring = R eturnS tring..",";
end
end
-- devolver la cadena que fue construida
return R eturnS tring;
end
CountS tring = Count(1 0);
D
ialog.M essage("Conteo",CountS tring);
Las últimas dos líneas del script de arriba utilizan la función Count para construir una
cadena contando del 1 al 1 0,la almacenan en una variable llamada CountS tring,y luego
muestran el contenido de la variable en un mensaje de diá
logo.
Valores Múltiples Devueltos
Adicionalmente,puedes devolver valores múltiples de funciones:
function S ortNumbers(Number1 ,Number2)
if Number1 <= Number2 then
return Number1 ,Number2
else
return Number2,Number1
end
end
firstNum,secondNum = S ortNumbers(1 02,1 00);
D
ialog.M essage("Ordenados",firstNum ..","..secondNum);
32
El script anterior crea una función llamada S ortNumbers que toma dos argumentos y
luego devuelve dos valores. El primer valor devuelto es el número má
s pequeño, y el
segundo valor devuelto es el má
s grande. D
ate cuenta que especificamos dos variables
para recibir los valores devueltos de la llamada de función en la penúltima línea. La
última línea del script muestra los dos números en el orden que fueron clasificados por
la función.
Redefiniendo Funciones
Otra cosa interesante acerca de las funciones es que puedes “ignorar” (pasar por alto)
una previa definición de función simplemente redefiniéndola.
function H elloW orld()
D
ialog.M essage("M ensaje","H ola M undo");
end
function H elloW orld()
D
ialog.M essage("M ensaje ","H ola T ierra");
end
H elloW orld();
El script de arriba mostraráun cuadro de diá
logo que diga “H ola T ierra” y no “H ola
M undo”. Esto es porque la segunda versión de la función H elloW orld() hace que la
primera sea ignorada.
Poniendo Funciones en Tablas
U na cosa realmente poderosa acerca de las tablas es que éstas pueden ser usadas para
contener funciones también como otros valores. Esto es importante porque te permite
estar seguro que tus funciones tienen nombres únicos y está
n agrupadas lógicamente.
(Así es como todas funciones de AutoP lay M edia S tudio está
n implementadas). Aquí
tenemos un ejemplo:
-- H ace las funciones:
function H elloEarth()
D
ialog.M essage("M essage","H ello Earth");
end
function H elloM oon()
D
ialog.M essage("M essage","H ello M oon");
end
-- D
efine una tabla vacía:
H ello = {};
-- Asigna las funciones a la tabla:
H ello.Earth = H elloEarth;
H ello.M oon = H elloM oon;
33
-- Ahora llama a las funciones:
H ello.Earth();
H ello.M oon();
T ambién es interesante notar que puedes definir funciones directamente en tu definición
de tabla:
H ello = {
Earth = function ()D
ialog.M essage("M essage","H ello Earth")end,
M oon = function ()D
ialog.M essage("M essage","H ello M oon")end };
-- Ahora llama a las funciones:
H ello.Earth();
H ello.M oon();
34
Manipulación de Cadenas (Ligaduras)
En esta sección cubriremos brevemente algunas de las técnicas má
s comunes de
manipulación de cadenas o ligaduras,tales como conexión y comparación de cadenas.
(P ara má
s información sobre las funciones de cadena disponibles para ti en AutoP lay
M edia S tudio,ve al tema Program Reference / Actions / String de la ayuda en línea).
Conexión de Cadenas
Y a hemos cubierto el tema de conexión de cadenas, pero vale la pena profundizar sobre
él.El operador para la conexión de cadenas es dos puntos en fila (..).P or ejemplo:
NombreCompleto = "Luis".."Cardona"; -- NombreCompleto es ahora "Luis Cardona"
-- T ambién puedes conectar números dentro de cadenas
D
iasD
elAño = 365;
AñoCadena = "H ay "..D
iasD
elAño.."días en un año.";
Observa que puedes poner espacios en ambos lados de los puntos, o en un solo lado, o
no poner ningún espacio. P or ejemplo, las siguientes cuatro líneas logrará
n el mismo
resultado:
foo =
foo =
foo =
foo =
"H ello "..user_name;
"H ello "..user_name;
"H ello "..user_name;
"H ello "..user_name;
Comparación de Cadenas
D
espués de la conexión, una de las cosas má
s comunes que querrá
s hacer con las
cadenas es comparar una cadena con otra. D
ependiendo de qué constituye una
“comparación”,ésta puede ser muy simple o sólo un poco mañosa.
S i quieres ejecutar una comparación sensible a diferencia entre mayúsculas y
minúsculas,entonces todo lo que tienes que hacer es usar el operador (==).P or ejemplo:
strOne = "S trongbad";
strT wo = "S trongbad";
if strOne = = strT wo then
D
ialog.M essage("¿Adivina qué?","¡Las dos cadenas son iguales!");
else
D
ialog.M essage("H mmm","Las dos cadenas son diferentes.");
end
35
P uesto que el operador == ejecuta una comparación sensible a diferencia entre
mayúsculas y minúsculas cuando es aplicado a cadenas, el script de arriba mostraráun
mensaje de diá
logo proclamando que las dos cadenas son iguales.
S i quieres ejecutar una comparación no sensible a diferencia entre mayúsculas y
minúsculas, entonces necesitas echar mano de las funciones S tring.U pper o
S tring.Lower, para asegurar que ambas cadenas tienen la misma escritura antes de que
las compares. La función S tring.U pper devuelve una versión “todas mayúsculas” de la
cadena dada, y la función S tring.Lower devuelve una versión “todas minúsculas”. D
ate
cuenta que no importa cuá
l función emplees en tu comparación, siempre y cuando
utilices la misma función a ambos lados del operador = = en tu declaración.
P or ejemplo:
strOne = "M ooohahahaha";
strT wo = "M OOohaH AH Aha";
if S tring.U pper(strOne)= = S tring.U pper(strT wo)then
D
ialog.M essage("¿Adivina qué?","¡Las dos cadenas son iguales!");
else
D
ialog.M essage("H mmm","Las dos cadenas son diferentes.");
end
En el ejemplo anterior, la función S tring.U pper convierte strOne a
“M OOOH AH AH AH A” y strT wo a “M OOOH AH AH AH A” y luego la declaración if
compara los resultados. (Nota: Las dos cadenas originales permanecen sin cambio). D
e
esta manera, no importa cuá
les mayúsculas o minúsculas tenían las cadenas originales;
todo lo que importa es si las letras son las mismas.
Conteo de Caracteres
S i alguna vez quieres saber qué tan larga es una cadena, puedes contar fá
cilmente el
número de caracteres que contiene. S ólo utiliza la función S tring.Length, como en este
ejemplo:
trabador = "T res tristes tigres tragaban trigo en tres trises trastos sentados en un trigal...";
num_carac = S tring.Length(trabador);
D
ialog.M essage("¡Este trabalenguas tiene:",num_carac .."caracteres!");
… lo cual produciráel siguiente mensaje de diá
logo:
36
Encontrando Cadenas
Otra cosa común que querrá
s hacer con cadenas es buscar una cadena dentro de otra.
Esto es muy simple de hacer usando la acción S tring.Find.
P or ejemplo:
strS earchIn = "¿V erdad que es un día para maravillarse?";
strS earchFor = "maravilla";
-- busca strS earchIn en el interior de strS earchFor
nFoundP os = S tring.Find(strS earchIn,strS earchFor);
if nFoundP os ~= nil then
-- encuéntralo!
D
ialog.M essage("R esultado de la Búsqueda",strS earchFor ..
"fue encontrado en la posición "..nFoundP os);
else
-- no hubo suerte
D
ialog.M essage("R esultado de la Búsqueda ",strS earchFor .."¡no fue
encontrado!");
end
...causaría que el siguiente mensaje fuera mostrado:
Consejo: P rueba experimentando con diferentes valores para strS earchFor y
strS earchIn.
Reemplazando Cadenas
U na de las cosas má
s poderosas que puedes hacer con las cadenas es ejecutar una
búsqueda y reemplazar la operación en ellas.El siguiente ejemplo muestra cómo puedes
usar la acción S tring.R eplace para sustituir cada evento de una cadena con otra dentro
de una cadena objetivo.
strT arget = "¡P uede haber solo una.S ólo una es permitida!";
strS earchFor = "una";
strR eplaceW ith = "una docena";
strNewS tring = S tring.R eplace(strT arget,strS earchFor,strR eplaceW ith);
D
ialog.M essage("D
espués de la búsqueda y el reemplazo:",strNewS tring);
37
-- crea una copia de la cadena objetivo sin espacios en ella
strNoS paces = S tring.R eplace(strT arget,"","");
D
ialog.M essage("D
espués de eliminar espacios:",strNoS paces);
El ejemplo anterior mostrarálos dos mensajes siguientes:
Extrayendo Cadenas
H ay tres funciones de cadena que te permiten “extraer” una porción de una cadena, en
vez de copiar la misma cadena entera. Estas funciones son S tring.Left, S tring.R ight y
S tring.M id.
S tring.Left copia un número de caracteres desde el comienzo de la cadena. S tring.R ight
hace lo mismo, pero contando desde el extremo derecho de la cadena. S tring.M id te
permite copiar un número de caracteres comenzando desde cualquier posición en la
cadena.
P uedes usar estas funciones para ejecutar todo tipo de operaciones avanzadas en
cadenas
Aquí estáun ejemplo bá
sico mostrando cómo trabajan estas funciones:
strOriginal = "D
e verdad me da gusto verte de nuevo.";
-- copia los primeros 22 caracteres dentro de strLeft
strLeft = S tring.Left(strOriginal,22);
-- copia los últimos 1 5 caracteres dentro de strR ight
strR ight = S tring.R ight(strOriginal,1 5);
-- crea una nueva cadena con las dos piezas
strNeo = S tring.Left .."estupendo"..strR ight .."D
etente.";
38
-- copia la palabra "gusto"dentro de strM iddle
strM iddle = S tring.M id(strOriginal,22,5);
Convirtiendo Cadenas Numéricas a Números
P uede haber ocasiones en que tengas una cadena numérica y necesites convertirla a un
número.
P or 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,podrías 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 ”.
S i trataras de comparar este valor con un número, obtendrías un error de sintaxis
diciendo que intentaste comparar un número con una cadena.
P or ejemplo,si le asignaras el siguiente script al evento OnClick de un botón:
edad = "31 ";
if edad > 1 8 then
D
ialog.M essage("","Eres mayor de 1 8.");
end
...se produciría el siguiente mensaje de error:
El problema en este caso es que la línea dos del script compara el contenido de la
variable “edad”con el número 1 8:
if age > 1 8 then
Esto genera un error porque edad contiene una cadena y no un número. El motor de
script no te permite comparar números con cadenas de esta manera. No hay forma de
saber si querías tratar age como un número,o tratar 1 8 como una cadena.
La solución es simplemente convertir el valor de edad a un número antes de compararlo.
H ay dos formas de hacer esto.U na forma es usar la función S tring.T oNumber.
La función S tring.T oNumber convierte una cadena numérica a el número equivalente,
de tal modo que pueda ser usado en una comparación numérica.
39
edad = "31 ";
if S tring.T oNumber(edad)> 1 8 then
D
ialog.M essage("","T ú eres mayor de 1 8.");
end
Lo que produciría un mensaje de diá
logo como el siguiente:
La otra forma saca ventaja de la habilidad del motor de script para convertir números en
cadenas cuando sabe cuá
les son sus intenciones. P or ejemplo, si está
s ejecutando una
operación aritmética (tal como la suma de dos números), el motor automá
ticamente
convertirápor ti cualquier cadena numérica a números:
edad = "26"+ 5;-- el resultado seráun valor numérico
El ejemplo anterior no generaráningún error porque el motor de script entiende que la
única forma de que la declaración tenga sentido es que diste a entender que se usara la
cadena numérica como un número. Como resultado, el motor automá
ticamente
convierte la cadena numérica a un número de modo que se pueda ejecutar el cá
lculo.
S abiendo esto, podemos convertir una cadena numérica en un número sin cambiar su
valor simplemente añadiendo un 0 en ella,tal como se muestra a continuación:
edad = "31 ";
if (edad + 0)> 1 8 then
D
ialog.M essage("","T ú eres mayor de 1 8.");
end
En el ejemplo de anterior, el añadirle 0 a una variable, consigue que el motor convierta
el valor a un número, y que el resultado luego sea comparado con 1 8. ¡Y a no habrá
error!
40
Otras Funciones Incorporadas
Funciones de Script
H ay 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);
P or ejemplo, digamos que escribimos el siguiente script dentro de un archivo llamado
M yS cript.lua (justamente un archivo de texto conteniendo este script, creado con el
W ordpad de W indows o algún otro editor de texto). Es indispensable que guardes este
archivo con la opción “Guardar como”de tu editor de texto y debes guardarlo como tipo
“T exto sin Formato”o con la opción “T odos los archivos”,es decir,no lo guardes como
.txt.
D
ialog.M essage("H ola","M undo");
Ahora arrastramos y soltamos el archivo dentro de la ventana principal de AutoP lay
M edia S tudio.(Esto copiaráel archivo dentro de la carpeta S cripts de nuestro proyecto).
Apareceráun diá
logo que pregunta si queremos añadir una línea require a nuestro script
global.P or ahora haz click en “No”. Explicaremos la declaración require má
s tarde.
Ahora,donde sea que agreguemos la siguiente línea de script para un evento:
dofile(_S ourceFolder.."\\AutoP lay\\S cripts\\M yS cript.lua");
… ese archivo de script seráleido y ejecutado inmediatamente. En este caso, deberá
s
ver un mensaje de diá
logo con el mensaje amigable “H ola M undo”.
41
Consejo: U tiliza la función 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 programación. Esta función es
similar a la dofile, excepto que cargaráun archivo dado una vez por sesión, 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 línea no haránada
… sólo la primera línea será siempre ejecutada. D
espués de eso, el motor de
programación sabe que el archivo ha sido cargado y ejecutado, y en el futuro llama para
requerir que el archivo no tenga efecto.
D
ate cuenta que siempre y cuando pongas el archivo .lua dentro de la carpeta S cripts de
tu proyecto,ya no tienes que proporcionar una ruta completa del archivo.P or ejemplo:
require("M yS cript.lua");
...es lo mismo que:
require(_S ourceFolder.."\\AutoP lay\\S cripts\\M yS cript.lua");
D
ebido a que require solo cargaráun archivo de script dado una vez por sesión, esto es
lo má
s apropiado para cargar scripts que contienen sólo variables y funciones. P uesto
que las variables y las funciones son globales por defecto, tú solamente necesitas
“cargarlas” una vez; cargar reiteradas veces la misma definición de función sólo sería
una pérdida de tiempo.
Esto hace a la función require una gran forma de cargar librerías de script externas.
Cada script que necesite una función desde un archivo externo puede con toda seguridad
acudir a la función require, y el archivo realmente serácargado sólo 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 vá
lidos devueltos son “nil,” “number,”
“string,”“boolean,”“table,”o “function”.P or ejemplo:
42
a = 989;
strT ype = type(a); -- establece strT ype como "number"
a = "H ola";
strT ype = type(a); -- establece strT ype como "string"
El tipo de función es especialmente útil cuando escribes tus propias funciones que
necesitan ciertos tipos de datos para poder operar. P or ejemplo, la siguiente función
utiliza type()para asegurar que ambos de sus argumentos son números:
-- encuentra el má
ximo de dos números
function M ax(Number1 ,Number2)
-- asegura que ambos argumentos son numéricos
if (type(Number1 )~= "number")or (type(Number2)~= "number")then
D
ialog.M essage("Error","P lease enter numbers");
return nil – estamos usando nil para indicar un error de condición
else
if Number1 >= Number2 then
return Number1 ;
else
return Number2;
end
end
end
Acciones
AutoP lay M edia S tudio viene con un gran número de funciones incorporadas. En la
interface del programa, estas funciones incorporadas son comúnmente referidas como
actions (acciones). P ara propósitos de programación, acciones y funciones son
esencialmente lo mismo; sin embargo, el término “acciones” está reservado
generalmente para aquellas funciones que ye vienen incorporadas en el programa y son
incluidas en la lista alfabética de acciones en la ayuda en línea. Cuando nos referimos a
funciones que han sido creadas por otros usuarios o por ti mismo, el término
“funciones”es preferido.
43
Depurando Tus Scripts
El S cripting de Autoplay (o cualquier tipo de programación)es relativamente fá
cil una
vez que te familiarices con él.S in embargo,incluso los mejores programadores cometen
errores, y necesitan “darle una planchadita”a las “arrugas ocasionales”de su código.El
ser bueno para depurar scripts reduciráel tiempo para lanzar al mercado tus proyectos e
incrementar la cantidad de tiempo de descanso. P or favor lee esta sección para obtener
consejos en el uso de Auto P lay M edia S tudio tan habilidosa y eficazmente como sea
posible.
Esta sección explicarálos métodos de manipulación de errores, así como también
cubriráun buen número de técnicas de depuramiento.
Manipulación de Errores
T odas las acciones incorporadas en AutoP lay M edia S tudio utilizan las mismas técnicas
bá
sicas de manipulación de errores. S in embargo, esto no es necesariamente cierto para
cualquier función,módulo o script hechos por terceros (incluso los scripts desarrollados
por Indigo R ose Corporation que no está
n incorporados dentro del producto). Aunque
estos scripts desarrollados externamente desde luego pueden hacer uso del sistema de
manejo de errores del Autoplay, pueden necesariamente no hacerlo. P or consiguiente,
deberías consultar siempre al autor o la documentación del script o del módulo para
encontrar cómo se manipulan los errores.
H ay dos tipos de errores que puedes tener en tus scripts cuando las acciones de
AutoP lay M edia S tudio son llamadas: errores de sintaxis y errores operativos o
funcionales.
Errores de Sintaxis
Los errores de sintaxis ocurren cuando la sintaxis (o “gramá
tica”) de un script es
incorrecta, o una función recibe argumentos que no son apropiados. Algunos errores de
sintaxis son detectados por AutoP lay M edia S tudio cuando construyes o previsualizas tu
aplicación.
P or 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 programación en tiempo de construcción (cuando construyas tu
proyecto).
Otro tipo de error de sintaxis es cuando no le pasas el tipo o número correcto de
argumentos a una función.P or ejemplo,si pruebas y ejecutas este script:
D
ialog.M essage("H ola");
44
… el proyecto se construirábien, debido a que no hay errores de sintaxis obvios en el
script. H asta donde el motor de programación pueda decir,la llamada de la función está
bien formada. El nombre es vá
lido, los paréntesis de abertura y cierre concuerdan, las
comillas está
n en la posición correcta, e incluso hay un punto y coma de finalización de
la línea.T odo se ve en orden.
S in embargo,en tiempo de ejecución verá
s algo como lo siguiente:
¡No se mira tan bien después de todo!, ¿verdad? D
ate cuenta que el mensaje dice que
dos argumentos son requeridos por la función D
ialog.M essage. Ah, nuestro script sólo
proporcionóun argumento.
D
e acuerdo al prototipo de función para D
ialog.M essage, parece que la función puede
incluso aceptar má
s de cinco argumentos:
Observando con atención el prototipo de función, vemos que los últimos tres
argumentos tienen valores por defecto, los cuales será
n utilizados si esos argumentos
son omitidos de la llamada de función. Los primeros dos argumentos (T itle y T ext)no
tienen valores por defecto, así que no pueden ser omitidos sin generar un error. P ara no
hacer larga la historia, estábien llamar la acción D
ialog.M essage con cualquiera de 2 a
5 argumentos… pero 1 argumento no es suficiente.
Entonces,una sintaxis correcta podría ser:
D
ialog.M essage("H ola","Bienvenido");
Lo que tendría que mostrar un mensaje de diá
logo como el que sigue:
45
Afortunadamente,errores de sintaxis como éste son usualmente detectados en tiempo de
construcción o cuando pruebas tu aplicación. U sualmente los mensajes de error son
bastante claros,haciendo fá
cil para ti localizar e identificar el problema
Errores Funcionales
Los errores funcionales son aquellos que ocurren debido a que la funcionalidad de la
acción en sí misma falla. Estos ocurren cuando a una acción se le da información
incorrecta,tal como la ruta de un archivo que no existe.P or ejemplo,el siguiente código
produciráun error funcional:
filecontents = T extFile.R eadT oS tring("this_file_don'
t exist.txt");
S i colocas ese script ahora mismo dentro de un evento y lo pruebas, verá
s que nada
parece suceder.Esto se debe a que los errores funcionales de AutoP lay M edia S tudio no
son automá
ticamente mostrados de la misma forma que los errores de sintaxis. T e
dejamos a tu elección manipular (o el dejarlos así)estos errores funcionales.
La razón de esto es que puede haber ocasiones en que no te importa si una función falla.
D
e hecho, podría esperarse así. P or ejemplo, el siguiente código intenta eliminar una
carpeta llamada C:\M i Carpeta T emporal:
Folder.D
elete("C:\\M i Carpeta T emporal ");
S in embargo, en este caso no te importa si realmente se consigue borrarla, o si, en
primer lugar, la carpeta ni existía. T ú solamente quieres asegurarte que si esa carpeta en
particular existe, seráborrada. S i la carpeta no existía, la acción Folder.D
elete 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ú querías, no
necesitas hacer nada al respecto. Y ciertamente no quieres que el usuario vea ningún
mensaje de error.
Contrariamente, puede haber ocasiones en que es muy importante para ti saber si una
acción falla.D
icho por ejemplo que quieres copiar un archivo muy importante:
File.Copy("C:\\T emp\\M i Archivo.dat","C:\\T emp\\M i 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 depuración te echan una mano.
Continúa leyendo sobre Acciones de D
epuración en la siguiente pá
gina…
46
Acciones de Depuración
AutoP lay M edia S tudio viene con algunas funciones muy útiles para depurar tus
aplicaciones.En esta sección les echaremos un vistazo a algunas de ellas.
Application.GetLastError
Esta es la acción má
s importante a usar cuando se trata de averiguar si ha ocurrido un
problema. En tiempo de ejecución siempre hay un valor interno que almacena el estado
de la última acción que fue ejecutada. Al inicio de una acción, este valor es fijado en 0
(el número cero). Esto significa que todo estábien. S i un error funcional ocurre dentro
de la acción,el valor es cambiado a algún valor distinto de cero.
A este último valor de error se puede acceder en cualquier momento utilizando la acción
Application.GetLastError.
La sintaxis es:
last_error_code = Application.GetLastError();
Aquí estáun ejemplo que utiliza esta acción:
File.Copy("C:\\T emp\\M i Archivo.dat","C:\\T emp\\M i Archivo.bak");
error_code = Application.GetLastError();
if (error_code ~= 0)then
-- ¡algún tipo de error ha ocurrido!
D
ialog.M essage("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
aplicación. Esta no es necesariamente la forma en que todos los errores será
n
manejados, pero ilustra el punto. P uedes hacer lo que quieras cuando un error ocurra,
como llamar una función diferente o cualquier otra cosa que puedas idear.
El ejemplo anterior tiene un posible problema. Imagina que el usuario ve un mensaje
como éste:
P ara el usuario sería mucho má
s agradable que se mostrara alguna información acerca
del problema exacto. Bueno, está
s de suerte. En tiempo de ejecución hay una tabla
47
llamada _tblErrorM essages que contiene todos los posibles mensajes de error, indexada
por los códigos de error. P uedes utilizar fá
cilmente el último número de error para
obtener un mensaje de error actual que le darámá
s sentido al usuario del que le da un
número como “1 021 ”.
P or ejemplo,aquí tenemos un script modificado para mostrar la cadena de error actual:
File.Copy("C:\\T emp\\M i Archivo.dat","C:\\T emp\\M i Archivo.bak");
error_code = Application.GetLastError();
if (error_code ~= 0)then
-- ¡algún tipo de error ha ocurrido!
D
ialog.M essage("Error","Error en copia de archivo: "..
_tblErrorM essages[error_code]);
Application.Exit();
end
Ahora el script produciráel siguiente mensaje de error:
¡La información es mucho má
s clara ahora!
S ólo recuerda que el valor del último error se reanuda cada vez que una acción es
ejecutada.P or ejemplo,el siguiente script no produciráun mensaje de error:
File.Copy("C:\\T emp\\M i Archivo.dat","C:\\T emp\\M i Archivo.bak");
-- En este punto Application.GetLastError()podría no ser cero,pero...
D
ialog.M essage("Q ué tal","H ola M undo");
-- U ps,ahora el número del último error serápara la acción D
ialog.M essage,
-- y no para la acción File.Copy.La acción D
ialog.M essage reajustaráel
-- número del último error a 0,y las siguientes líneas no percibirá
n ningún
-- error que haya sucedido en la acción File.Copy.
error_code = Application.GetLastError();
if (error_code ~= 0)then
-- ¡Algún tipo de error ha ocurrido!
D
ialog.M essage("Error",
"Error en copia de archivo: "..
_tblErrorM essages[error_code]);
48
Application.Exit();
end
Debug.ShowWindow
El tiempo de ejecución en AutoP lay M edia S tudio tiene la habilidad de mostrar una
ventana de depuración que puede ser utilizada para mostrar mensajes depurados. Esta
ventana existe durante toda la ejecución de tu aplicación,pero estarásólo visible cuando
tú le indiques.
La sintaxis es:
D
ebug.S howW indow(show_window);
...donde show_window es un valor Booleano. S i es true, la ventana de depuración es
mostrada,y si es false,la ventana se ocultará
.P or ejemplo:
-- muestra la ventana de depuración
D
ebug.S howW indow(true);
S i llamas este script, la ventana de depuración apareceráencima de tu aplicación, pero
ninguna otra cosa realmente sucederá
. Aquí es donde las siguientes acciones D
ebug
vienen.
Debug.Print
Esta acción muestra el texto de tu elección en la ventana de depuración. P or ejemplo,
prueba el siguiente script:
D
ebug.S howW indow(true);
for i = 1 ,1 0 do
D
ebug.P rint("i = "..i .."\r\n");
end
La parte “\r\n” es, de hecho, dos secuencias de escape que está
n siendo utilizadas para
iniciar una nueva línea. (Esto es técnicamente llamado un par “cambio de
línea/alimentación de línea”). P uedes usar \r\n en la ventana de depuración en el
momento que desees insertar una nueva línea.
El script anterior producirála siguiente salida en la ventana de depuración:
49
P uedes usar este método para mostrar todo tipo de información en la ventana de
depuración.Algunos usos típicos son mostrar el contenido de una variable de modo que
puedas ver qué contiene en tiempo de ejecución, o mostrar tus propios mensajes de
depuración como “inside outer for loop” (“interno externo para bucle”) o “foo()
function started” (“foo() función iniciada”). T ales mensajes crean un rastro como
migajas de pan que puedes rastrear para entender qué estásucediendo detrá
s de las
escenas de tu proyecto. Estos pueden ser invaluables a la hora de depurar tus scripts o
probar tu último algoritmo.
Debug.SetTraceMode
AutoP lay M edia S tudio puede correr en un modo especial “trace” en tiempo de
ejecución que mostraráinformación acerca de cada línea de script que es ejecutada en la
ventana de depuración, incluyendo el valor de Application.GetLastError() si la línea
implica el llamado de una acción incorporada. P uedes activar o desactivar este modo
“trace”usando la acción D
ebug.S etT raceM ode.
D
ebug.S etT raceM ode(turn_on);
...donde turn_on es un valor Booleano que le dice al programa que apague o encienda el
modo “trace”.
Aquí estáun ejemplo:
D
ebug.S howW indow(true);
D
ebug.S etT raceM ode(true);
for i = 1 ,3 do
D
ialog.M essage("Número",i);
end
File.Copy("C:\\fake_file.ext","C:\\fake_file.bak");
50
Al ejecutar este script se producirála siguiente salida en la ventana de depuración:
Nota que cada línea producida por el modo trace inicia con “T R ACE:”. Esto es así para
que puedas distinguirlas de otras líneas que mandes a la ventana de depuración con
D
ebug.P rint. El número después de la parte “T R ACE:” es el número de línea que está
siendo ejecutado actualmente en el script.
Activar el modo trace es algo que probablemente no querrá
s hacer en tu aplicación
distribuible final, pero realmente puede ayudar a encontrar problemas durante el
desarrollo de tu proyecto. D
e hecho,hay una opción en las preferencias de construcción
de AutoP lay M edia S tudio que te permite activar automá
ticamente el modo trace cada
vez que tu lo previsualices. (Elige Edit > P references y haz click en la categoría Build.
En la sección P review,activa la opción llamada “S how D
ebug W indow”).S in embargo,
incluso con esta opción habilitada, el modo trace no estaráactivado en la versión que
construyas cuando publiques tu proyecto, a menos que tú específicamente lo actives en
tu script
Debug.GetEventContext
Esta acción es utilizada para obtener una cadena descriptiva acerca del evento que está
siendo ejecutado actualmente. Esto puede ser útil si defines una función en un lugar
pero la llamas desde algún otro, y quieres ser capaz de decir desde dónde estásiendo
llamada la función en cualquier momento dado. P or ejemplo, si ejecutas este script
desde el evento de un botón en la P á
gina 1 :
D
ialog.M essage("Event Context",D
ebug.GetEventContext());
...verá
s algo como esto:
51
Dialog.Message
Esta acción nos ayuda a mostrar mensajes de diá
logo.Y a has visto el uso de esta acción
a lo largo de este documento, y por buenas razones. Esta es una gran acción que
utilizamos mucho en nuestros códigos cuando estamos tratando de seguirle la pista a un
problema.
52
Conceptos Finales
Esperamos que este documento te haya ayudado a entender la programación en
AutoP lay M edia S tudio.U na vez que te familiarices con ella,es realmente una divertida
y poderosa forma de lograr realizar cosas.
Otros Recursos
Aquí está una lista de otros lugares en los que puedes obtener ayuda con la
programación en AutoP lay M edia S tudio.
Archivo de Ayuda (Help File)
El Archivo de Ayuda de AutoP lay M edia S tudio estáempaquetado con buen material de
referencia para todas las acciones y eventos soportados en AutoP lay M edia S tudio, y
para el ambiente de diseño mismo. P uedes acceder al archivo de ayuda en cualquier
momento eligiendo el menú H elp > AutoP lay M edia S tudio H elp.
Otro consejo útil: si está
s en el editor de script y quieres aprender má
s acerca de una
acción,simplemente haz click en la acción y oprime la tecla F1 de tu teclado.
Guía del Usuario (User’s Guide)
La Guía del U suario es una fantá
stica manera de iniciar con AutoP lay M edia S tudio.
Estáescrita con un formato de tutorial fá
cil de seguir, enseñá
ndote acerca de eventos,
acciones y scripts. Estará
s capacitado en poco tiempo. P uedes acceder a la Guía del
U suario eligiendo el menú H elp > AutoP lay M edia S tudio U ser'
s Guide.
Sitio Web de AutoPlay Media Studio
El sitio W eb de AutoP lay M edia S tudio estálocalizado en http://www.indigorose.com.
Asegúrate revisar el foro de usuarios donde puedes leer preguntas y respuestas de
usuarios y del equipo de Indigo R ose así como hacer tus propias preguntas.
U na forma rá
pida de acceder a los foros en línea es elegir el menú H elp > U ser Forums.
Soporte Técnico de Indigo Rose
S i necesitas ayuda con cualquier concepto de programación o tienes un bloqueo mental
para llevar a cabo algo, siéntete libre de visitar http://support.indigorose.com. Aunque
nosotros no podemos escribir un script por ti o depurar tus propios scripts, estaremos
felices de responder cualquier pregunta en general que tengas.
El Sitio Web Lua
El motor de programación de AutoP lay está basado en un popular lenguaje de
programación llamado Lua. Lua estádiseñado e implementado por un equipo de
T ecgraf, la Computer Graphics T echnology Group of P U C-R io (en la U niversidad
53
Católica P ontificia de R ío de Janeiro en Brasil). P uedes aprender má
s acerca de Lua y
su historia en su sitio web oficial:
http://www.lua.org
Aquí también puedes encontrar la última documentación sobre el lenguaje Lua, junto
con tutoriales y una comunidad realmente amigable de desarrolladores de Lua.
D
ate cuenta que puede haber otras funciones incorporadas que existan en Lua y en
AutoP lay M edia S tudio que no está
n oficialmente soportadas en AutoP lay. Estas
funciones,si las hay,está
n documentadas en el M anual de R eferencia de Lua 5.1 .
El M anual de R eferencia oficial en español lo puedes ver en:
http://www.lua.org/manual/5.1 /es/
Solamente las funciones listadas en la ayuda en línea son soportadas por Software
Indigo Rose. Cualquier otra función “no documentada” que puedas encontrar en la
documentación Lua, no estásoportada por Indigo R ose. Aunque estas funciones pueden
trabajar,debes usarlas íntegramente por ti mismo.
54
Descargar