Tipos
El tipado es opcional en ULA, pues puedes elegir si los especificas o no. Las variables con tipos de datos no especificados son inferidos en tiempo de compilación a partir del valor asignado.
Las operaciones entre tipos diferentes pueden o bien ser convertidas a un tipo común si ambos tipos son compatibles, o simplemente arrojar un error. Dos tipos son compatibles si ambos representan distenteroos tamaños de un mismo grupo de tipo (Un ejemplo de ello son los enteros o los puntos flotantes).
El tipo de dato deber ser o bien definido por el usuario, o una estructura, enumerado, clase o un tipo primitivo.
Advertencia
1 | Los tipos que no son especificados son inferidos, esto es fundamentalmente diferente en comparación con los tipos dinámicos. |
Tipos Primitivos
Entero
Hay múltiples tipos de enteros disponibles basados en la longitud, y en el signo. Pueden tener un mínimo de 8 bits de longitud y un máximo de 128. Si la longitud no es especificada, la misma por defecto es 64.
- Con signo: entero
, entero8
, entero16
, entero32
, entero64
, entero128
- Sin signo: uentero
, uentero8
, uentero16
, uentero32
, uentero64
, uentero128
1 2 3 4 | x: entero = 5 x += 27 large_num: entero128 = 5 |
Información
1 2 | En ULA, entero y uentero son por defecto de 64 bits, y pueden ensancharse según sea necesario. Este no será el comportamiento por defecto si el tamaño es especificado. |
Flotante
Representa al número real de punto flotante.
1 | x: flotante = 0.5 |
Doble
Representa al número real de punto flotante de doble precisión.
1 2 | x: doble = 172312.41923 my_inf = INFINITO # INFINITO tiene el valor especificado en IEEE 754 |
Cadena
El tipo cadena
es la implementación ULA de las listas de cadenas/caracteres. Todas las cadenas de ULA soportan UTF-8.
1 2 3 | x: cadena = "Hello World!" x = '🍌' x = '夜のコンサートは最高でした。' |
Booleano
El tipo booleano
ocupa solo 1 bit y su valor puede ser VERDADERO
o FALSO
.
1 | x: booleano = VERDADERO |
List
Las listas son mutables por defecto, declaradas usando [elem1, elem2, ...]
y tienen un tamaño dinámico, comenzando desde 0, y los miembros son accedidos utilizando su índice dentro de corchetes. El tipo de dato de la tupla puede ser declarado entre <>
. Si es tipo es omitido, la lista tendrá el tipo de los elementos contenidos.
1 2 3 | x = [1,2,3,4] y: lista<doble> = [1.5,5.5] mostrar(x[2]) |
Tupla
Las tuplas son como listas, pero inmutables, y declaradas usando (elem1, elem2, ...,)
El tipo de dato de la tupla puede ser declarado entre <>
. Si es tipo es omitido, la tupla tendrá el tipo de los elementos contenidos.
1 2 3 | x = (1,5,20) y: tupla<doble> = (1.5,5.5) mostrar(x[0]) |
Rango
El tipo rango
es similar al rango de Python, utilizando la sintaxis inicio..fin
,
Ranges are similar to Python's ranges, defined using start..end
kind of syntax, and they're especially used for loops
1 2 | para x en 0..100 mostrar(x) |
Warning
Ranges can not currently be assigned to variables
Func
ULA soporta funciones de primera clase, lo que significa que a las variables se les puede asignar funciones, y que el tipo func
está hecho para denotar el tipo de la función. Los tipos de los parámetros son incluidos entre <>
separados por coma ,
, y el tipo de retorno con una flecha ->
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | x: func<entero, entero> -> entero = def (x: entero, y: entero) -> entero si x > y retorna x + y sino retorna x * y y = def (x: entero, y: entero) -> entero si x > y retorna x + y sino retorna x * y z: func = def() mostrar(5) |
Vacío
Vacío es solo utilizado como valor de retorno para las funciones e ilustra el hecho de que las mismas no retornan un valor definido. Si el valor de retorno es omitido, vacío
será utilizado por defecto.
1 2 3 4 5 | def example() -> void pass def example2() # Here the retorna type is omitted pass |
Type Operations
Is
El operador binario es
chequea si el tipo de dato del operando izquierdo coincide con el tipo de dato del operando derecho, y retorna un booleano como resultado.
1 2 | x: entero = 5 mostrar(x is entero) |
Como
El operador binario como
convierte al operando izquierdo al tipo de dato del operando derecho y retorna el valor converso.
1 2 | x: flotante = 5.5 mostrar(x as entero) # Deberia imprimir 5 |