Declaraciones del programa
29 min
brightscript admite los siguientes tipos de instrucciones (tenga en cuenta que brightscript no distingue entre mayúsculas y minúsculas) la sintaxis de cada instrucción se documenta con más detalle más adelante en este capítulo biblioteca atenuar = (asignación) fin detener ir a rem \<or> '" imprimir para / a / fin para / paso / salir para \<o> siguiente for each / in / end for / exit for \<o> next mientras / fin mientras / salir de mientras función / end function / as / return ejemplo function main() as void dim cavemen\[10] cavemen push("fred") cavemen push("barney") cavemen push("wilma") cavemen push("betty") for each caveman in cavemen print caveman end for end function sintaxis de instrucciones cada línea puede contener una sola instrucción sin embargo, se puede utilizar dos puntos ( ) para separar múltiples instrucciones en una sola línea ejemplo myname = "fred" if myname="fred" then yourname = "barney"\ print yourname library nombredearchivo library brs la instrucción library le permite incluir sus propias bibliotecas brightscript (archivos brs ), que luego pueden ser utilizadas por su script las instrucciones library deben aparecer al principio de un script, antes de cualquier otra instrucción, función, operador, etc el sistema localiza una biblioteca buscando en el directorio que contiene el script actual, así como en el directorio sys /script lib/ tenga en cuenta que la función run() actualmente no cambia la ruta de una instrucción library a la del script llamado (es decir, el sistema continuará buscando en el directorio del script que llama) por otro lado, ejecutar un script directamente desde el shell de brightsign sí modifica la ruta de búsqueda de bibliotecas a la del script llamado la primera instrucción incluirá una biblioteca en la misma carpeta que el script, mientras que la segunda incluirá una biblioteca en una subcarpeta library "mybsl1 brs" library "new lib/mybsl2 brs" la siguiente instrucción incluirá la biblioteca bslcore brs docid\ a2aq frnag8hdssdqny8k , que tiene algunas funciones útiles de brightscript, desde el directorio sys /script lib/ library "v30/bslcore brs" dim nombre de dim (dim1, dim2, …, dimk) la instrucción dim ("dimension") proporciona un atajo para crear objetos roarray establece la variable name con el tipo “roarray” puede crear matrices de matrices según sea necesario para la multidimensionalidad la dimensión pasada a dim es el índice de la entrada máxima que se asignará (es decir, el tamaño inicial de la matriz = dimensión+1), aunque la matriz cambiará automáticamente a un tamaño mayor si es necesario las siguientes dos líneas crean matrices idénticas dim array\[5] array = createobject("roarray", 6, true) la expresión x\[a,b] es equivalente a x\[a]\[b] el siguiente script demuestra operaciones útiles en una matriz dim dim c\[5, 4, 6] for x = 1 to 5 for y = 1 to 4 for z = 1 to 6 c\[x, y, z] = k k = k + 1 end for end for end for k=0 for x = 1 to 5 for y = 1 to 4 for z = 1 to 6 if c\[x, y, z] <> k then print"error" stop k = k + 1 end for end for end for asignación ("=") variable = expresión la instrucción de asignación (“=”) asigna una variable a un nuevo valor en cada una de las siguientes líneas, a la variable del lado izquierdo del operador igual se le asigna el valor de la constante o expresión del lado derecho del operador igual a$="a rose is a rose" b1=1 23 x=2 23 x=x b1 end la instrucción fin finaliza la ejecución del script normalmente stop la instrucción detener interrumpe la ejecución del script, devuelve un error “stop” e invoca el depurador use el comando cont en el indicador del depurador para continuar la ejecución del script o el comando paso para ejecutar un solo paso en el script goto etiqueta goto la instrucción goto transfiere el control del programa al número de línea especificado por etiqueta la instrucción etiqueta goto produce una operación de bifurcación un etiqueta es un identificador terminado con dos puntos en una línea que no contiene otras instrucciones ni expresiones ejemplo mylabel print "hello world" goto mylabel return expresión return la instrucción devolución regresa desde una función a quien la llamó si la función no es de tipo void, devolución también puede devolver un valor a quien la llamó print imprimir \[#output object], \[@location], lista de artículos la instrucción print imprime un elemento o una lista de elementos en la consola los elementos pueden ser cadenas, enteros, números de punto flotante, variables o expresiones un objeto con una interfaz ifint , iffloat , o ifstring también puede imprimirse si se especifica objeto de salida , esta instrucción imprimirá en un objeto con una interfaz ifstreamsend si la instrucción imprime una lista de elementos, los elementos deben separarse con punto y coma o comas si se usan puntos y coma, no se insertan espacios entre los elementos impresos; si se usan comas, el cursor avanzará automáticamente a la siguiente zona de impresión antes de imprimir el siguiente elemento los números positivos y el cero se imprimen con un espacio inicial (sin signo más) no se insertan espacios antes ni después de las cadenas ejemplo x = 5 print 25; " is equal to"; x ^2 ' prints "25 is equal to 25" ejemplo a$ = "string" print a$;a$,a$;" ";a$ 'prints "stringstring string string" cada zona de impresión en el siguiente ejemplo tiene 16 caracteres de ancho el cursor se mueve a la siguiente zona de impresión cada vez que encuentra una coma \> print "zone 1","zone 2","zone 3","zone 4" 'prints "zone 1 zone 2 zone 3 zone 4" ejemplo print "print statement #1 "; print "print statement #2" 'prints "print statement #1 print statement #2" en algunos casos, pueden omitirse los puntos y coma por ejemplo, la siguiente instrucción es válida print "this is a five "5"!!" un punto y coma final anula el retorno del cursor para que la siguiente instrucción imprimir comience donde terminó la anterior si no se usa puntuación final con una instrucción imprimir , el cursor baja al comienzo de la siguiente línea \[@location] si la consola en la que está imprimiendo tiene la interfaz iftextfield , puede usar el carácter @ para especificar dónde comenzará la impresión ejemplo print #m text field,@width (height/2 1)+(width len(msg$))/2,msg$; siempre que use imprimir @ en la línea inferior de la pantalla, un salto de línea automático hace que todas las líneas mostradas suban una línea para evitar que esto suceda, use un punto y coma al final de la instrucción tab (expresión) esta instrucción mueve el cursor a la posición especificada en la línea actual (módulo del ancho de la consola si la posición tab es mayor que el ancho de la consola) ejemplo print tab(5)"tabbed 5";tab(25)"tabbed 25" tenga en cuenta lo siguiente sobre la instrucción tab la instrucción tab puede utilizarse varias veces en una lista imprimir no se requiere puntuación después de una instrucción tab pueden usarse expresiones numéricas para especificar una posición tab la instrucción tab no puede utilizarse para mover el cursor hacia la izquierda si el cursor está más allá de la posición especificada, la instrucción tab se ignora pos(x) esta instrucción devuelve un entero que indica la posición actual del cursor desde 0 hasta el ancho máximo de la ventana esta instrucción requiere un argumento ficticio en forma de cualquier expresión numérica print tab(40) pos(0) 'prints 40 at position 40 print "these" tab(pos(0)+5)"words" tab(pos(0)+5)"are"; print tab(pos(0)+5)"evenly" tab(pos(0)+5)"spaced" for / end for para variable contador = valor inicial hasta valor final paso incremento / fin para \<o> siguiente la instrucción para crea un bucle iterativo que permite ejecutar una secuencia de instrucciones del programa un número especificado de veces los valores valor inicial , valor final y incremento pueden ser cualquier expresión la primera vez que se ejecuta la instrucción para , estas tres variables se evalúan y sus valores se guardan; cambiar las variables durante el bucle no tendrá efecto sobre el funcionamiento del bucle sin embargo, la counter variable no debe cambiarse, o el bucle no funcionará normalmente la primera vez que se ejecuta la instrucción para , el contador se establece tanto en el valor como en el tipo de valor inicial al comienzo de cada bucle, el valor de counter variable se compara con valor final si el valor de counter variable es mayor que valor final , el bucle finalizará y la ejecución continuará con la instrucción siguiente a la instrucción fin para (o siguiente ) si, por otro lado, el contador aún no ha superado valor final , el control pasa a la primera instrucción después de la instrucción para si increment es un número negativo, el bucle finalizará cuando el valor de counter variable sea menor que valor final cuando el flujo del programa alcanza la instrucción fin para (o siguiente ) , el contador se incrementa por la cantidad de incremento especificada (o se decrementa si increment es un valor negativo) si el lenguaje paso \[incremento] no se incluye en la instrucción para , el incremento toma el valor predeterminado de 1 use salida para para salir prematuramente de un bloque para el siguiente script decrementa i al comienzo de cada bucle hasta que es menor que 1 for i=10 to 1 step 1 print i end for for each in / end for para cada elemento en objeto / fin para \<o> siguiente la instrucción para cada puede iterar a través de un conjunto de elementos en cualquier objeto que tenga una interfaz ifenum (es decir, un enumerador) el bloque para finaliza con la instrucción fin para (o siguiente ) los objetos que están ordenados intrínsecamente (como rolist ) se enumeran en orden, mientras que los objetos que no tienen un orden intrínseco (como roassociativearray ) se enumeran en un orden aparentemente aleatorio es posible eliminar entradas a medida que se enumeran use salida para para salir prematuramente de un bloque para se pueden enumerar los siguientes objetos rolist , roarray , roassociativearray , romessageport el siguiente script itera sobre un arreglo asociativo en orden aleatorio, imprime cada par clave/valor y luego lo elimina aa={joe 10, fred 11, sue 9} for each n in aa print n;aa\[n] aa delete\[n] end for anidamiento de instrucciones for each la instrucción para cada solo puede rastrear un puntero por instancia de objeto, por lo que anidar bucles para cada que iteran sobre el mismo objeto puede provocar que la serie finalice prematuramente values = {a 1, b 2, c 3, d 4, e 5, f 6} for each key outer in values 	print "outer ";key outer;" ";values\[key outer] 	for each key inner in values 'this will cause problematic behavior 	 print "inner ";key inner;" ";values\[key inner] 	end for end for para solucionar esta limitación con arreglos asociativos, copie las claves en un arreglo e itere sobre el arreglo en el bucle anidado para cada values = {a 1, b 2, c 3, d 4, e 5, f 6} valuesarray = \[] for each key in values 'copy the keys to an array 	valuesarray push(key) end for for each key outer in values 	print "outer ";key outer;" ";values\[key outer] 	for each key inner in valuesarray 'iterate over the array of keys 	 print "inner ";key inner;" ";values\[key inner] 	end for end for while / exit while expresión while / exit while un bucle mientras se ejecuta hasta que la expresión especificada sea falsa use la instrucción salir mientras para salir prematuramente de un bloque mientras k=0 while k<>0 k=1 print "loop once" end while while true print "loop once" exit while end while if / then / else expresión if then sentencias \[else sentencias] esta es la forma de una sola línea de la instrucción if then else; consulte la siguiente sección para obtener más detalles sobre la forma de bloque de la instrucción if then else la instrucción if indica al intérprete que pruebe la siguiente expresión si la expresión es true, el control procederá a las instrucciones que siguen inmediatamente a la expresión si la expresión es false, el control saltará ya sea a la instrucción si no correspondiente (si existe) o a la siguiente línea del programa después del bloque ejemplo if x>127 then print "out of range" end entonces es opcional en las instrucciones anteriores y similares sin embargo, entonces a veces es necesario para eliminar la ambigüedad, como en el siguiente ejemplo if y=m then m=o 'won't work without then bloque if / elseif / then / endif la forma de bloque (es decir, de varias líneas) de if / then / else tiene la siguiente sintaxis if booleanexpression \[ then ] \[ block ] \[ elseifstatement+ ] \[ elsestatement ] end if elseifstatement = elseif booleanexpression \[ then ] \[ block ] elsestatement = else \[ block ] ejemplo vp msg loop msg=wait(tiut, p) if type(msg)="rovideoevent" then if debug then print "video event";msg getint() if lm=0 and msg getint() = meden then if debug then print "videofinished" retcode=5 return endif else if type(msg)="rogpiobutton" then if debug then print "button press";msg if esc0 and msg=b0 then retcode=1\ return if esc1 and msg=b1 then retcode=2\ return if esc2 and msg=b2 then retcode=3\ return if esc3 and msg=b3 then retcode=4\ return else if type(msg)=" invalid" then if debug then print "timeout" retcode=6 return endif goto vp msg loop function() as type / end function nombredefunción(parámetro as type, …) as type cada función tiene su propio ámbito una función se declara utilizando la instrucción function() los paréntesis pueden contener uno o más parámetros opcionales; los parámetros también pueden tener valores y expresiones predeterminados se puede declarar el tipo de cada parámetro el tipo de retorno de la función también puede declararse si no se declara un tipo de parámetro o tipo de retorno, de manera predeterminada es dynamic los tipos intrínsecos se pasan por valor (y se crea una copia), mientras que los objetos se pasan por referencia la instrucción sub puede utilizarse en lugar de función como un atajo para crear una función con tipo de retorno void un parámetro puede ser uno de los siguientes tipos integer float double string object dynamic el retorno de la función puede ser uno de los siguientes tipos void integer float double string object dynamic identificador "m" si se llama a una función desde un arreglo asociativo, entonces la variable local m se establece en el arreglo asociativo en el que se almacena la función si no se llama a la función desde un arreglo asociativo, entonces su variable m se establece en un arreglo asociativo que es global para el módulo y persiste entre llamadas el identificador m solo debe utilizarse para el propósito indicado anteriormente no recomendamos usar m como identificador de propósito general ejemplo sub main() obj={ add add a 5 b 10 } obj add() print obj result end sub function add() as void m result=m a+m b end function funciones anónimas una función sin una declaración de nombre se considera anónima la siguiente es una declaración simple de función anónima myfunc=function (a, b) return a+b end function print myfunc(1,2) las funciones anónimas también pueden utilizarse con literales de arreglos asociativos q = { starring function(o, e) str = e getbody() print "starring " + str toks = box(str) tokenize(",") for each act in toks actx = box(act) trim() if actx <> "" then print "actor \[" + actx + "]" o actors push(actx) endif end for return 0 end function } q starring(myobj, myxml)