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 |