xTalk es una familia vagamente definida de lenguajes de secuencias de comandos . La madre de todos los lenguajes xTalk es HyperTalk , el lenguaje utilizado por el entorno HyperCard de Apple . Estos lenguajes se caracterizan por sintaxis simples similares al inglés , utilizando metáforas de la vida real sobre un aparato de envío de mensajes e imágenes de estilo Smalltalk, con límites de bloque de estilo Pascal, pero una estructura menos rígida.
Un guión de muestra
en mouseUp vaya a la tercera tarjeta si la última palabra de la primera línea del campo 1 de la tarjeta contiene "hola", luego diga "Okay" repita mientras el mouse está arriba beep end repeat end mouseUp
xTalk idiomas
Los lenguajes xTalk comparten un conjunto común de estructuras y comandos de datos básicos, así como el modelo de objeto general, y por lo tanto permiten una portabilidad relativa entre sí:
- HyperTalk
- SuperTalk
- SenseTalk
- Transcripción
- LiveCode Script , anteriormente llamado RevTalk y MetaTalk
Idiomas inspirados en xTalk
Algunos lenguajes de programación tienen similitudes superficiales con HyperTalk y se inspiraron en él. Sin embargo, tienen modelos de objetos que difieren tan sustancialmente que la migración de código de otro xTalk requiere una reescritura completa:
- Lingo (con sintaxis antigua)
- ActionScript
- AppleScript
- JavaScript y ECMAScript
Construcciones del lenguaje
Todos los lenguajes xTalk comparten las siguientes construcciones básicas:
Mensajería y controladores
xTalk tiene mensajería similar a Smalltalk. [1] Para enviar un mensaje, escriba un comando o llamada a una función:
commandName 1,2,3
poner functionName ( 1 , 2 , 3 ) en el resultado
como en Pascal. Este mensaje y sus parámetros no requieren declaraciones, se resuelven en tiempo de ejecución al manejador correcto. Un manejador parece
en CommandName param1 , param2 , param3 - las cosas aquí terminan CommandName function functionName param1 , param2 , param3 - hacer cosas aquí end functionName
y se comporta bastante como el equivalente de Pascal, excepto que su lista de parámetros es variable. [2] Si se pasan menos parámetros a un controlador de los que declara en su primera línea, las variables restantes se rellenan con cadenas vacías. Si se pasan más, se ignoran en silencio. En lugar de declarar los parámetros como una lista después del nombre del controlador, también se puede acceder a ellos mediante las funciones paramCount()
y param()
, que también dan acceso a los parámetros ignorados.
Los scripts xTalk a menudo se adjuntan a objetos (HyperTalk, SuperTalk, MediaTalk, LiveCode), aunque no siempre (por ejemplo, CompileIt !, SenseTalk). Si una secuencia de comandos no contiene un controlador para un mensaje en particular que utiliza, el mensaje se pasa a la secuencia de comandos del objeto propietario para que lo maneje. Los scripts también pueden transmitir manualmente un mensaje a los padres mediante el pass
comando.
Comandos centrales
Todos los xTalks admiten los siguientes comandos básicos:
poner <valor> en <contenedor>
Esta es la declaración de asignación principal. La mayoría de xTalks también admiten after
o before
para prefijar / agregar valores entre sí. También admiten un comando 'get <value>' que es equivalente a una instrucción put en un contenedor llamado 'it'.
return <valor>
Al igual que en Pascal, así es como un controlador pasa datos al remitente del mensaje. Esto también es válido en los controladores de comandos, donde el valor de retorno se almacenará en la variable incorporada the result
.
establecer [ la ] < propiedad > [ de [ < rango > de ] < objeto > ] en < valor >
Cambie la propiedad de un objeto (o un rango de texto en su contenido de texto) a un valor dado. Esto se utiliza tanto para modificar variables de instancia de objetos como para aplicar estilos de texto a campos de texto. Si no se especifica ningún objeto, se asume una propiedad global de la propia aplicación host.
Estructuras de control
Todos los xTalks admiten declaraciones condicionales de la siguiente forma:
Si < condición > entonces los comandos demás comandos final si
Si se omite el salto de línea que sigue a una if
declaración then
o else
token, solo puede seguir un comando y la end if
declaración puede omitirse. Esto permite escribir una declaración if-then-else completa en una sola línea y encadenar condicionales como cadenas if-then-else-if-then-else. Además, else
se puede omitir todo el bloque. El then
token puede estar envuelto en la siguiente línea.
Las declaraciones de bucle no son tan libres:
repetir [ para ] < contar > [ veces ] comandos finalizar repetir repetir con < variableName > = < startNumber > [ abajo ] a < endNumber > comandos end repeat repetir mientras < condición > comandos finalizar repetir repetir hasta que los comandos de < condición > finalicen repetir
Muchos dialectos agregan sintaxis de bucle adicional para cosas como bucle sobre fragmentos.
Expresiones y operadores
xTalks admite las expresiones matemáticas habituales. [3] Aparte de los habituales +
, -
, *
y /
los operadores, sino que también soportan div
(división entera), ^
(exponente), mod
(resto de la división entera), =
o is
(igualdad), <>
, ≠
o is not
(desigualdad), <
, >
, <=
, >=
, ≤
, ≥
(comparación de número de / orden de las cuerdas especie), contains
, is in
, is not in
(subcadena coincidente), is within
, is not within
(coordenadas de los puntos se encuentran las coordenadas del rectángulo en el interior), not
(negación boolean), and
(Y lógico para booleanos), or
(OR lógico para booleanos), &
(concatenación de cadenas),&&
(concatenación de cadenas con un espacio en el medio), is a
y is an
(detección de tipo), there is a
, there is an
, there is no
, there is not a
(determinar la existencia de archivo / objeto).
Variables
Las variables en xTalks no necesitan declararse, sino que se crean de forma bastante transparente cuando se les pone un valor por primera vez. Si se utiliza un nombre de variable en el que aún no se ha puesto nada, se trata como un literal de cadena sin comillas y se evalúa según su nombre (imitando así el comportamiento de un intérprete línea por línea). Las variables en xTalks son variantes, es decir, conceptualmente son todas cadenas, que se interpretan internamente como el tipo de datos para la operación actual que se realiza sobre ellas. Sin embargo, pueden tener los siguientes tipos: cadena, entero, número, punto, rect, fecha o lógico (también conocido como booleano), donde todos son iguales a sus representaciones de cadena, que en el caso de rects y puntos son listas separadas por comas de números (h, v resp. izquierda, arriba, derecha, abajo), las lógicas son "verdaderas" o "falsas".Es perfectamente válido realizar operaciones de cadena sobre números y luego inmediatamente operaciones matemáticas.
Las variables globales deben declararse usando una palabra clave especial (la mayoría de las veces global
, pero en algunos xTalks universal
se usa la palabra en su lugar) para importarlas al alcance del controlador actual.
Expresiones en trozos
Todos los xTalks admiten expresiones de fragmentos, que son operaciones de nivel medio para extraer y modificar rangos de subcadenas de una variable. Estas expresiones pueden ser tanto de valor como de contenedor, y generalmente tienen la forma:
<chunkType> <startOffset> [a <endOffset>] de <value>
Donde los tipos de fragmentos admitidos suelen ser char (acter), elemento, palabra o línea (aunque algunos dialectos añaden soporte para bytes y otras unidades de fragmentos). La mayoría de los xTalks admiten cambiar el delimitador que se usará para los elementos (por defecto, la coma) usando la itemDelimiter
propiedad y restablecerlo en un punto posterior (aunque SuperTalk lo restablece a coma al final de cada controlador, mientras que HyperTalk lo restablece solo en tiempo de inactividad , es decir, entre eventos del sistema).
También hay comandos matemáticos como add <value> to <container>
etc.
Incompatibilidades entre dialectos
La mayoría de xTalks se basan en una arquitectura de nivel HyperCard 1.2. Dado que HyperCard 1.2 no admitía múltiples ventanas, menús, películas o navegadores web, muchos xTalks implementan estos aspectos de manera diferente. Por ejemplo, SuperTalk implementa múltiples ventanas reemplazando el nivel de 'pila' de la jerarquía de objetos con un 'proyecto' (un contenedor de script que representa el archivo) y una 'ventana' (efectivamente lo que solía ser una pila, pero puede haber varias en una proyecto), mientras que HyperCard 2.0 y LiveCode mantuvieron el nivel de 'pila' y, en su lugar, proporcionaron comandos nuevos (pero diferentes) que permiten solicitar que se abra una segunda pila en su propia ventana en lugar de reemplazar la pila actual en pantalla. HyperSense mantuvo un enfoque similar, pero cambió el nombre de la 'tarjeta' a 'página'.
Los botones y menús emergentes son objetos persistentes completamente nativos en la imagen del archivo del proyecto con scripts en SuperTalk, y se hace referencia como 'elemento "copia" del menú "editar"' y similares, mientras que en HyperTalk son objetos transitorios que se agregan a un La barra de menú global compartida por todas las pilas que usan el comando 'crear menú', son referenciadas por 'menuItem "copia" del menú "editar"' y solo pueden tener un 'menuMessage' de una sola línea que envían cuando se seleccionan.
De manera similar, los tipos y estilos de objetos colocados en una tarjeta difieren mucho entre xTalks en el punto de divergencia de HyperCard 1.2.x. La mayoría tiene botones y campos, pero SuperCard no permite que los campos de fondo tengan el mismo contenido en diferentes tarjetas (lo que requiere el uso de gráficos de texto para dibujar en las etiquetas, algo que HyperCard no tenía). Y el término compuesto "parte" de HyperCard 2.x para incluir botones, campos, etc. en una tarjeta tampoco es compatible con todos los xTalks.
Adiciones tardías al idioma
Aunque HyperCard nunca proporcionó esa característica, la mayoría de xTalks implementan hoy la característica de 'propiedades de usuario' introducida por primera vez por SuperCard. Permite agregar variables de instancia personalizadas a los objetos existentes de la aplicación host, que luego se pueden usar como las propiedades integradas para contener cualquier dato, de cualquier tipo. Un ejemplo de uso de una propiedad de usuario es
si ", myProperty," no está en "," & the userProperties de mí & "," entonces defina myProperty de cd btn 1 end si establece myProperty de mí en "Lo que quiera"
También hay un undefine
comando para eliminar propiedades de un objeto nuevamente.