SenseTalk es un lenguaje de programación de alto nivel similar al inglés de la familia XTalk , que admite paradigmas tanto procedimentales como orientados a objetos . Los scripts de SenseTalk están pensados para que sean legibles en gran medida por personas comunes, incluidas aquellas con poca o ninguna formación en programación.
Para ello, SenseTalk incluye una serie de elementos del lenguaje que proporcionan una funcionalidad orientada a las tareas humanas en lugar del comportamiento subyacente de la máquina. Por ejemplo, para comprobar si una cantidad es divisible por 3, el script podría utilizar la expresión o , poniendo el énfasis en la legibilidad y centrándose en el concepto humano de divisibilidad. [1] Compárese esto con los lenguajes de programación más tradicionales (C, Java, Python, etc.) donde la misma prueba normalmente se escribiría como , centrándose en las operaciones de la máquina necesarias para determinar el resultado. [2]if quantity is divisible by 3 …
if quantity is a multiple of 3 …
if (quantity % 3) == 0 …
Este cambio de enfoque, que se aleja del cálculo subyacente de la máquina y se dirige hacia una descripción similar al inglés del comportamiento en términos humanos, conduce a la descripción de SenseTalk como un "lenguaje de programación orientado a las personas". [3]
Como lenguaje de "programación orientada a las personas", ciertos aspectos del diseño de SenseTalk lo distinguen de otros lenguajes de programación y le dan un toque distintivo. Estos van desde características mundanas como la falta de distinción entre mayúsculas y minúsculas, hasta elementos sintácticos que mejoran la legibilidad, pasando por características más sutiles como tipos de variables fluidos, hasta funciones avanzadas como unidades y el lenguaje de patrones SenseTalk.
Los nombres de variables y palabras clave de SenseTalk no distinguen entre mayúsculas y minúsculas, lo que permite que las personas utilicen las mayúsculas de forma informal sin cambiar su comportamiento.
Ponga 12 en manzanas, ponga 5 en plátanos. PONGA "Total de piezas de fruta: " y manzanas + plátanos --> muestra "Total de piezas de fruta: 17"
Esto también se aplica a los nombres de propiedades en una lista de propiedades (el nombre de SenseTalk para un diccionario o tabla hash).
Coloque { Nombre : "Verde" , Código hexadecimal : "#00FF00" } en AColor, coloque el nombre de aColor --> muestra "Verde", coloque el código hexadecimal de acolor --> muestra "#00FF00"
Además, las operaciones de texto, incluidas las comparaciones, búsquedas, etc., no distinguen entre mayúsculas y minúsculas de forma predeterminada, aunque se pueden hacer que sí lo hagan cuando sea necesario.
Establezca el nombre en "McMaster", coloque el nombre que contiene "master" --> muestra Verdadero (se ignoran las mayúsculas y minúsculas) coloque el nombre que contiene "master" considerando las mayúsculas y minúsculas --> muestra Falso
Además de tener nombres que no distinguen entre mayúsculas y minúsculas, las variables en SenseTalk son inusuales en otros aspectos. Las variables no necesitan ser declaradas y no tienen tipo. Una variable surge cuando se utiliza por primera vez y su tipo depende del tipo de valor que se almacena en ella.
Esta flexibilidad va más allá del “ tipo pato ” que se encuentra en otros lenguajes, en el que una variable dada tiene un tipo que se establece cuando se le asigna un valor. En SenseTalk, una variable se considera un “contenedor” que puede contener cualquier tipo de valor. El tipo de valor que contiene una variable puede cambiar durante la ejecución de un script, por lo que la misma variable puede comenzar conteniendo un número, luego una cadena y luego una lista de valores. Esta “fluidez de tipos” permite a las personas trabajar de una manera muy flexible, manipulando valores a voluntad y tratando cada valor de acuerdo con cómo se está utilizando en un punto dado del script.
Una consecuencia de las variables sin tipo de SenseTalk es que, en general, no hay operadores “sobrecargados” —es decir, operadores que realizan operaciones diferentes según el tipo de variable con la que estén trabajando—. Por ejemplo, en algunos lenguajes, el +
operador realizará una suma cuando se use con operandos numéricos, y realizará una concatenación de cadenas cuando se use con operandos de cadena. En SenseTalk, los operandos son todos fluidos, por lo que es necesario tener un operador para realizar la suma ( +
, que tratará sus operandos como números), y otro operador para la concatenación de cadenas ( &
, que tratará sus operandos como cadenas).
Suma 1 + 2 y 3 + 4 --> muestra 37
En este ejemplo, el +
operador tiene mayor prioridad que el &
operador, por lo que la expresión es equivalente a '(1 + 2) & (3 + 4)' o '3 & 7', lo que da como resultado “37”. Si se usaran paréntesis para ejecutar el &
operador primero, entonces '1 + (2 & 3) + 4' se convertiría en 1 + “23” + 4, lo que daría como resultado 28.
SenseTalk incluye cientos de “variables predefinidas”. Se trata de nombres de variables que se pueden utilizar como variables ordinarias, pero que comienzan con un valor predefinido si se utilizan sin almacenar primero un valor en ellas. Algunos de los valores predefinidos son números, como pi o cero. Muchos son caracteres especiales o símbolos, como euroSign , copyrightSign o hotBeverage . Y algunos tienen otros tipos de valores, como jsonListFormat , que es una lista de propiedades que contiene varios pares clave/valor que se pueden utilizar para configurar la propiedad global listFormat .
Ponga "El área de un círculo con radio 5 es: " y pi * 5 al cuadrado
Cualquier variable que no tenga un valor predefinido y que aún no se le haya asignado explícitamente un valor se evaluará como su propio nombre o como vacía según el contexto en el que se utilice. Esto permite utilizar palabras sin comillas en muchos casos en los que, de otro modo, se requerirían comillas.
Ponga CookieCount --> muestra "CookieCount" Agregue 3 docenas a CookieCount --> se trata como vacío o 0 Ponga CookieCount --> muestra 36
SenseTalk incluye compatibilidad total con muchos tipos diferentes de unidades (longitud, masa, duración, volumen, frecuencia, etc.). Los valores numéricos pueden tener unidades asociadas. Los valores de las unidades se convierten según sea necesario al realizar operaciones aritméticas.
Coloque 5 yardas + 2 pies -> muestra 17 pies
Las variables pueden contener valores con unidades. Las unidades se trasladan junto con el valor y se aplican en cálculos posteriores.
Agregue 5 yardas a la longitud , agregue 2 pies a la longitud ; el valor de la longitud se convierte a una unidad compatible para realizar la suma. Agregue longitud -> muestra 17 pies. Agregue 42 pulgadas al ancho. Establezca el área en longitud * ancho . Agregue área -> muestra 59,5 pies cuadrados.
También se admiten unidades más complejas, como velocidad (millas por hora o metros/segundo) o aceleración (m/s^2).
SenseTalk reconoce fechas y horas en una amplia variedad de formatos y admite cálculos de fecha y hora.
Ponga "8:22" - "8:15" --> muestra 420 segundos
Los valores de fecha y hora se pueden almacenar en variables y los formatos se mantienen mediante cálculos.
Pon "3 de marzo" + 34 días --> muestra "6 de abril"
Ponga "2021-03-04" en nextDateAgregue 4 semanas a nextDate. Ponga nextDate --> muestra "2021-04-01"Agregue 4 meses a nextDate. Ponga nextDate --> muestra “2021-08-01”
Las expresiones de fragmentos de SenseTalk provienen de su herencia como miembro de la familia de lenguajes XTalk derivados de HyperTalk . Las expresiones de fragmentos permiten trabajar con fragmentos de texto utilizando términos ingleses conocidos: caracteres, palabras, elementos, líneas. SenseTalk amplía la sintaxis de fragmentos original y extiende su uso más allá del texto, a los elementos dentro de una lista y también a los bytes dentro de datos binarios.
Coloca los caracteres 7 a 11 de "Rumpelstiltskin" --> muestra "zanco"
Coloque los primeros 3 caracteres de la segunda palabra de “ catálogo de libros ” --> muestra “cat”
Las expresiones de fragmentos también se pueden utilizar para modificar valores. En la terminología del lenguaje Xtalk, un fragmento de un contenedor (como una variable) también es un contenedor, por lo que cualquier comando que cambie el valor de un contenedor también se puede utilizar para cambiar un fragmento.
Pon "Rumpelstiltskin" en funnyNameColoque “ bump ” en los caracteres 7 a 12 de funnyNamePon funnyName --> muestra “Rumpelbumpkin”
SenseTalk incluye comandos para abrir, leer y escribir archivos. Un archivo de texto se puede tratar como un contenedor (como una variable), por lo que el contenido del archivo se puede leer simplemente colocando el archivo en una variable. De manera similar, se puede escribir un archivo colocando una variable u otra expresión en el archivo.
Coloque el archivo "/tmp/addressList.txt" en direccionesColoque "Miriam, 219 Sparrow Ln, Freeburgh, MA" y retorne después de las direccionesColoque las direcciones en el archivo "/tmp/addressList.txt"
Dado que un archivo es un contenedor, cualquier comando que modifique un contenedor se puede utilizar directamente en un archivo.
Coloque return y "Earlybird,12 Elm St,Vista,NM" después de la línea 1 del archivo "/tmp/addressList.txt"
Acceder a los registros de una base de datos es más complejo que leer un archivo, pero SenseTalk también aplica el concepto de contenedores. Esto permite conectarse a una base de datos y actualizar un campo en un registro específico con muy poco código.
Coloque { tipo : ” ODBC ” , DSN : ” clientes ” , usuario : ” admin ” , contraseña : ” sEcrEt ” } en custDBColocar la tabla “ suscripciones ” de custDB en subs – establece una conexión con una tabla de DBAgregue 12 meses a la fecha de vencimiento del registro de subs donde CustNum es “ 83946 - d ” – actualiza un valor en un registro en particular
El “lenguaje de patrones” de SenseTalk [4] implementa expresiones regulares utilizando una sintaxis legible similar a la del inglés. El siguiente ejemplo crea un patrón para identificar un número de la Seguridad Social estadounidense (como “999-99-9999”):
Establezca ssnPattern en < 3 dígitos , luego guión, luego 2 dígitos , luego guión, luego 4 dígitos >
Los patrones se pueden utilizar de distintas maneras.
Si userEntry coincide con ssnPattern , establezca validSSN en verdadero
Coloque cada ocurrencia de ssnPattern en el archivo “ userData ” en ssnList
Si clientInfo no contiene ssnPattern , coloque “ < SSN missing > ” después de clientInfo
El lenguaje de patrones permite crear patrones a partir de otros patrones. Este ejemplo utiliza el ssnPattern anterior para definir un patrón que evitará la coincidencia en los casos en que el carácter inmediatamente anterior o posterior también sea un dígito:
Establezca isolateSSN en < ssnPattern no precedido por dígito , no seguido por dígito >
El lenguaje SenseTalk apareció por primera vez en 1992 como lenguaje de programación en HyperSense, una aplicación de creación multimedia para la plataforma NeXTSTEP , basada en HyperCard . En ese momento, el lenguaje era poco más que una copia del lenguaje HyperTalk de HyperCard . Un rediseño y replanteamiento más ambicioso del lenguaje dio como resultado los inicios del lenguaje actual, con la versión 0.02 que se lanzó como lenguaje de programación en Eggplant V1.0 en 2002. El lenguaje ha seguido creciendo y evolucionando, con mejoras como la incorporación de compatibilidad con: