Librería estándar
La librería estándar son las funciones que están siempre a mano, sin use ni import: escribir y leer en la consola, esperar y medir el tiempo, convertir valores, sacar números al azar, saber en qué plataforma corre el programa y cuánta memoria usa. Aquí están también las constantes globales que conoce el compilador.
Funcionan igual en Windows y en las placas, salvo lo que dice Plataformas.
Funciones
| Función | Qué hace | Devuelve |
|---|---|---|
print(...), println(...) | Escriben sus argumentos en la consola; println salta de línea al final. | nil |
readLine() | Lee una línea de la consola. | Cadena |
cls() | Borra la consola. | nil |
ink(color), paper(color) | Cambian el color del texto y del fondo de la consola. | nil |
pause(ms) | Espera ms milisegundos. | nil |
clock() | Los milisegundos desde el arranque. | Entero |
time(), time(formato) | La fecha y la hora. | Cadena |
chr(código) | El carácter de un código ASCII. | Cadena |
int(x), float(x) | Convierten un número o un booleano. | Entero, decimal |
type(x) | El tipo de un valor. | Entero (una constante t*) |
randomize(semilla) | Siembra los números al azar. | nil |
random(), random(max), random(min, max) | Un número al azar. | Entero o decimal |
abs(x), round(x), sqrt(x) | Valor absoluto, redondeo y raíz cuadrada. | Número |
vlenght(x, y) | La longitud de un vector. | Decimal |
len(x) | Lo que mide una cadena, una lista o un mapa. | Entero |
rgb(r, g, b) | Un color en el formato 0xRRGGBB. | Entero |
memUse(), memFree() | La memoria que usa la VM y la que queda libre. | Entero |
platform() | Dónde corre el programa. | Entero (una constante HW_*) |
vmerror() | Nada útil en la 0.9.7: siempre 0. | Entero |
encode64(texto), decode64(texto) | Codifican y decodifican en Base64. | Cadena |
Si les pasas un argumento de otro tipo, lanzan ERR_TYPE_MISMATCH. Con un número de argumentos que no es el suyo, el programa no compila; cls, ink y paper lo dicen al ejecutarse, con ERR_INVALID_ARG_NUMBER. Los errores se cuentan en Errores y excepciones.
Para terminar el programa antes de tiempo está exit: ver exit.
Plataformas
| Windows | ESP32 / ESP32-S3 | ESP32-P4 | ESP32-S31 | |
|---|---|---|---|---|
print, println | Escriben en la consola del programa. | Escriben en el puerto serie. | Escriben en el puerto serie. | Escriben en el puerto serie. |
readLine() | Lee de la consola. | No recibe nada. | No recibe nada. | No recibe nada. |
cls() | Borra la consola. | Envía el código de terminal que borra la pantalla. | Envía el código de terminal que borra la pantalla. | Envía el código de terminal que borra la pantalla. |
ink(), paper() | No hacen nada. | Envían el código de terminal del color. | Envían el código de terminal del color. | Envían el código de terminal del color. |
clock() | Cuenta desde que arrancó la VM. | Cuenta desde que arrancó la placa. | Cuenta desde que arrancó la placa. | Cuenta desde que arrancó la placa. |
time() | La fecha y la hora del PC. | Las del reloj de la placa. | Las del reloj de la placa. | Las del reloj de la placa. |
memFree() | Siempre 0. | La RAM interna libre, sin la PSRAM. | Toda la memoria libre, con la PSRAM. | Toda la memoria libre, con la PSRAM. |
platform() | 4 | 1 en el ESP32 y 2 en el S3 | 6 | 7 |
- Lo que escribe el programa en una placa lo ves en el Output con Open Serial (ver Tu programa en una placa).
- Los códigos de terminal (ANSI) los entiende un programa de terminal; el Output del IDE no los interpreta.
- Para que el reloj de la placa tenga la hora buena, la placa necesita WiFi y NTP: se encienden en ESP32 Tools (ver Pantalla, sonido, SD y red).
Consola
print / println
print escribe sus argumentos en la consola, uno detrás de otro, sin nada entre ellos. println hace lo mismo y salta de línea al final; sin argumentos, println() solo salta de línea. Admiten cualquier número de argumentos, de cualquier tipo, y devuelven nil.
var nombre = "Ana"
var puntos = 120
println("Jugador: ", nombre, " - puntos: ", puntos)
print("Sin salto, ")
println("y con salto")
println([1, "dos", 3.5], " ", {"vidas": 3})
Jugador: Ana - puntos: 120
Sin salto, y con salto
[1, dos, 3.5] {vidas: 3}
Así escriben cada valor:
| Valor | Cómo sale | Ejemplo |
|---|---|---|
| Entero | Tal cual. | 120 |
| Decimal | Con las cifras justas para que, al volver a leerlo, sea el mismo número, y sin decimales si no los tiene. | 0.1 sale 0.1, 0.1 + 0.2 sale 0.30000000000000004, y 10.0 sale 10 |
| Cadena | Sin comillas. | Ana |
Booleano y nil | Con su nombre. | true, nil |
| Lista y mapa | Con sus elementos; las cadenas, sin comillas. | [1, dos, 3.5], {vidas: 3} |
| Struct | Su nombre y sus campos. | Punto{x: 1, y: 2} |
| Instancia de una clase | El nombre de la clase. | Gato instance |
El error de un catch | Su nombre y su mensaje. | ERR_KEY_NOT_FOUND: The given key was not present in the map. |
| Valor de error | Error y su número. | Error 9 |
- Para escribir un decimal con menos cifras, conviértelo antes con su método
toString(), que usa 15: convar x = 0.1,println(x.toString())escribe0.1. - Los argumentos se escriben a medida que se calculan. Si uno lanza una excepción, los de antes ya han salido, sin salto de línea:
println("Precio: ", precios[9])deja escritoPrecio:antes del error. - Para unir textos en una sola cadena, los métodos de las cadenas están en Cadenas.
readLine
readLine espera a que escribas una línea en la consola y pulses Enter, y la devuelve como cadena, sin el salto de línea.
print("Escribe tu nombre: ")
var nombre = readLine()
println("Hola " + nombre + ", ¡bienvenido!")
readLine() en placaEn la 0.9.7, readLine() no recibe la entrada por el puerto serie en las placas: el programa se queda esperando para siempre. Les pasa a los ejemplos que piden un dato, como CheckPrime o Palindromes. En Windows funciona.
cls
cls borra la consola.
cls()
En una placa, envía por el puerto serie el código de terminal que borra la pantalla.
ink / paper
ink(color) cambia el color del texto, y paper(color) el del fondo, con un número del 0 al 15:
| Color | Nombre | Color | Nombre |
|---|---|---|---|
| 0 | Negro | 8 | Gris oscuro |
| 1 | Azul | 9 | Azul claro |
| 2 | Verde | 10 | Verde claro |
| 3 | Cian | 11 | Cian claro |
| 4 | Rojo | 12 | Rojo claro (con ink, naranja) |
| 5 | Magenta | 13 | Magenta claro |
| 6 | Marrón | 14 | Amarillo |
| 7 | Gris claro | 15 | Blanco |
Con otro número no hacen nada. En una placa, envían por el puerto serie el código de terminal de ese color: los colores se ven en un programa de terminal que lo entienda, no en el Output del IDE.
ink(4) // texto rojo
println("Este texto es rojo")
ink(7) // vuelve al gris claro
paper(1) // fondo azul
println("Texto con fondo azul")
paper(0) // vuelve al fondo negro
ink y paper no hacen nada en WindowsEn la 0.9.7, ink() y paper() no cambian ningún color en la consola de Windows: el texto sale siempre con los colores de la consola. Tampoco dan error.
Tiempo
pause
pause(ms) detiene el programa ms milisegundos. Solo admite enteros: con un decimal lanza ERR_TYPE_MISMATCH.
println("Este mensaje sale ya.")
pause(3000)
println("Y este, 3 segundos después.")
- Mientras dura la pausa, el programa no hace nada más: lo que tenga que saltar en ese tiempo, como un callback de Timer, espera a que acabe.
- Para el ritmo de un juego no uses
pause: usaDisplay.fps(ver Display).
clock
clock() devuelve los milisegundos que han pasado desde el arranque: en Windows, desde que arrancó la VM; en una placa, desde que arrancó la placa, y sigue contando cuando la VM vuelve a empezar el programa. Sirve para medir cuánto tarda algo:
var inicio, final, tiempo_total
inicio = clock()
// Aquí iría el código del algoritmo
final = clock()
tiempo_total = final - inicio
println("El algoritmo ha tardado ", tiempo_total, " milisegundos")
time
time() devuelve la fecha y la hora en una cadena, en inglés, con este formato: el día de la semana, el mes, el día, la hora y el año.
time(formato) la devuelve como digas en formato: cada código con % se cambia por un dato, y el resto se copia tal cual. Los códigos más útiles están en la tabla de abajo.
println(time()) // Fri Nov 6 18:35:13 2026
println(time("%d/%m/%Y %H:%M")) // 06/11/2026 18:35
println(time("Hoy es %A")) // Hoy es Friday
(Con la fecha y la hora de cuando lo ejecutes.)
| Código | Qué pone | Ejemplo |
|---|---|---|
%Y | El año. | 2026 |
%y | El año, con dos cifras. | 26 |
%m | El mes, de 01 a 12. | 11 |
%d | El día del mes, de 01 a 31. | 06 |
%e | El día del mes, con un espacio delante en vez del cero. | 6 |
%H | La hora, de 00 a 23. | 18 |
%I | La hora, de 01 a 12. | 06 |
%p | AM o PM. | PM |
%M | El minuto, de 00 a 59. | 35 |
%S | El segundo, de 00 a 59. | 13 |
%A, %a | El día de la semana, en inglés, entero o en tres letras. | Friday, Fri |
%B, %b | El mes, en inglés, entero o en tres letras. | November, Nov |
%j | El día del año, de 001 a 366. | 310 |
%u | El día de la semana en número, del 1 (lunes) al 7. | 5 |
%w | El día de la semana en número, del 0 (domingo) al 6. | 5 |
%F | La fecha: %Y-%m-%d. | 2026-11-06 |
%T | La hora: %H:%M:%S. | 18:35:13 |
%R | La hora y el minuto: %H:%M. | 18:35 |
%% | Un %. | % |
- El resultado puede tener hasta 79 caracteres. Si es más largo, en Windows
timedevuelve una cadena vacía. - En Windows, la fecha y la hora son las del PC. En una placa, las de su reloj (ver Plataformas).
% que no existe cierra la VMEn Windows, time() con un código que no existe, como time("%Q"), cierra la VM sin ningún mensaje. Usa los códigos de la tabla.
Conversión y tipos
chr
chr(código) devuelve el carácter de un código ASCII, en una cadena de un carácter. chr(0) devuelve la cadena vacía.
var letra = chr(65)
println(letra) // A
var saltoLinea = chr(10)
print("Línea 1" + saltoLinea + "Línea 2")
Solo sirve para los códigos ASCII, del 1 al 127: con uno mayor da un solo byte, que no es una letra con tilde ni una eñe.
int
int(x) convierte un decimal en entero: quita la parte decimal (trunca hacia el cero). También convierte los booleanos: true da 1 y false, 0.
var decimal = 5.7
var entero = int(decimal)
println(entero) // 5
println(int(-5.7)) // -5
// También funciona con booleanos
println(int(true)) // 1
println(int(false)) // 0
No admite cadenas: int("7") lanza ERR_TYPE_MISMATCH. Para convertir una cadena, usa su método toInt(), por ejemplo texto.toInt() (ver Cadenas).
float
float(x) convierte un entero o un booleano en decimal. No admite cadenas: float("3.5") lanza ERR_TYPE_MISMATCH. Para convertir una cadena, usa su método toFloat(), por ejemplo texto.toFloat().
var entero = 10
var decimal = float(entero)
println(decimal) // 10
// Útil para operaciones que requieren precisión decimal
var resultado = float(5) / float(2)
println(resultado) // 2.5
println escribe 10 y no 10.0: un decimal sin parte decimal sale sin ella (ver print / println).
type
type(x) devuelve un entero que dice de qué tipo es x. Compáralo con las constantes t*:
func describir(v)
var t = type(v)
if (t == tInteger or t == tFloat) then
return "número"
elsif (t == tString) then
return "cadena"
elsif (t == tList) then
return "lista"
end
return "otra cosa"
end
println(describir(42)) // número
println(describir(2.5)) // número
println(describir("hola")) // cadena
println(describir([1, 2])) // lista
println(describir(nil)) // otra cosa
| Constante | Valor | Tipo |
|---|---|---|
tBool | 0 | Un booleano: true o false. |
tNil | 1 | nil. |
tInteger | 2 | Un entero. |
tFloat | 3 | Un decimal. |
tError | 4 | El error de un catch, o un valor de error de una función que ha fallado. |
tMethod | 6 | Un método de una instancia guardado en una variable, como var m = gato.maulla. |
tClass | 7 | Una clase. |
tFunction | 9 | Una función o una lambda. |
tInstance | 10 | Una instancia de una clase. |
tNative | 11 | Una función de la VM. |
tString | 12 | Una cadena. |
tList | 13 | Una lista. |
tMap | 14 | Un mapa. |
tArray | 15 | Un array. |
tFile | 16 | Un fichero abierto con File.open. |
tBitmap | 17 | Un bitmap, como el que devuelve Bitmap.load. |
tModule | 18 | Un módulo, como Display o Display.draw. |
tAbstract | 20 | Un objeto de un módulo: un sprite, un GridMap, un Bytes, una tira de LED… |
tEnumerator | 22 | Un enum. Sus valores son enteros: tInteger. |
- Un struct da 23, y el struct mismo (su nombre, sin crear nada) da 24. No tienen constante.
typees una palabra reservada: no puedes llamar así a una variable.
Números aleatorios
randomize
randomize(semilla) siembra el generador de números al azar con un entero. Con la misma semilla, random() da siempre la misma secuencia: sirve para repetir una partida o una prueba.
randomize(12345) // Inicializa con semilla 12345
// Ahora random() generará la misma secuencia cada vez
println(random(100)) // 67
randomize, siempre la misma secuenciaEl generador arranca siempre con la misma semilla: si no llamas a randomize, random() da la misma secuencia en cada ejecución. Para que cambie, siémbralo con un valor distinto cada vez, como randomize(clock()). Justo al arrancar, clock() apenas cambia de una ejecución a otra, así que llámalo después de algo que dependa del usuario, como esperar a que pulse una tecla. randomize solo admite enteros.
random
random da un número al azar:
| Llamada | Qué devuelve |
|---|---|
random() | Un entero cualquiera de 32 bits, también negativo. |
random(max) | Un entero de 0 a max, los dos incluidos. |
random(min, max) | Un entero de min a max, los dos incluidos. Da igual el orden: random(10, 1) es lo mismo que random(1, 10). |
random(min, max) con decimales | Un decimal entre min y max. |
// Un entero de 0 a 10
var a = random(10)
// Un entero de 100 a 200
var b = random(100, 200)
// Un decimal entre 0.0 y 1.0
var c = random(0.0, 1.0)
// Un decimal entre -10.5 y 10.5
var d = random(-10.5, 10.5)
- Con dos argumentos, los dos tienen que ser del mismo tipo:
random(1, 2.5)lanzaERR_TYPE_MISMATCH. - Con un solo decimal,
random(5.0)no da un decimal cualquiera: da uno sin parte decimal, de 0 a 5. Para un decimal, usarandom(0.0, 5.0).
Matemáticas
Las demás funciones matemáticas, como Math.floor o Math.sin, están en el módulo Math.
abs
abs(x) devuelve el valor absoluto de un número: el número sin el signo. Devuelve un entero si x es entero, y un decimal si es decimal.
println(abs(-5)) // 5
println(abs(8)) // 8
println(abs(-2.5)) // 2.5
round
round(x) redondea al entero más cercano. Si el número está justo a mitad de camino, se aleja del cero: round(3.5) da 4 y round(-2.5) da -3. El resultado es del mismo tipo que el número: con un decimal devuelve un decimal (round(3.5) vale 4.0, aunque println lo muestre como 4).
var numero = 3.14159265
var redondeado = round(numero)
println(redondeado) // 3
println(round(3.5)) // 4
println(round(3.49)) // 3
println(round(-2.5)) // -3
sqrt
sqrt(x) devuelve la raíz cuadrada de un número, siempre en decimal. Con un número negativo no lanza ningún error: devuelve NaN, el valor de «no es un número».
var x = 9
var resultado = sqrt(x)
println("La raíz cuadrada de ", x, " es ", resultado) // La raíz cuadrada de 9 es 3
println(sqrt(16)) // 4
println(sqrt(2)) // 1.4142135623730951
vlenght
vlenght(x, y) calcula la longitud de un vector 2D a partir de sus componentes: √(x² + y²). Devuelve un decimal. Se escribe así, vlenght.
var longitud = vlenght(3, 4)
println(longitud) // 5
// Útil para calcular distancias
var distancia = vlenght(10.5, 20.3)
println("Distancia: ", distancia) // Distancia: 22.854758804240312
Colecciones
len
len(x) devuelve lo que mide una cadena, una lista o un mapa: los bytes de la cadena, los elementos de la lista o los pares del mapa.
// Con cadenas
var cadena = "Hola mundo"
println(len(cadena)) // 10
// Con listas
var lista = [1, 2, 3, 4, 5]
println(len(lista)) // 5
// Con mapas
var mapa = {"a": 1, "b": 2, "c": 3}
println(len(mapa)) // 3
- En una cadena cuenta bytes: una letra con tilde o una eñe cuenta dos.
len("año")da 4. - No admite arrays: con uno lanza
ERR_TYPE_MISMATCH. Usa su métodosize()(ver Listas, mapas y arrays).
Colores
rgb
rgb(r, g, b) junta el rojo, el verde y el azul, cada uno de 0 a 255, en un color con el formato 0xRRGGBB: el que usan draw.color y las demás funciones de Draw.
var naranja = rgb(255, 128, 0)
println(naranja) // 16744448
println(naranja.toHex()) // FF8000
println(rgb(300, -5, 12.7) == rgb(255, 0, 12)) // true
Un componente por encima de 255 se queda en 255, uno negativo en 0, y los decimales se truncan.
Sistema y memoria
memUse
memUse() devuelve los bytes de memoria que la VM tiene reservados en ese momento para el programa.
var memoria_ocupada = memUse()
println("Memoria utilizada: ", memoria_ocupada, " bytes")
memFree
memFree() devuelve los bytes de memoria libres. En Windows devuelve siempre 0. En una placa, cuenta distinto según el chip: ver Plataformas, y la memoria de cada placa en Memoria y límites.
var memoria_libre = memFree()
println("Memoria libre: ", memoria_libre, " bytes")
Cómo libera memoria la VM, en el módulo GC.
platform
platform() devuelve un entero que dice dónde corre el programa:
| Valor | Plataforma | Constante |
|---|---|---|
0 | Plataforma desconocida | — |
1 | ESP32 | HW_ESP32 |
2 | ESP32-S3 | HW_ESP32S3 |
3 | Reservado | — |
4 | Windows | HW_WIN32 |
5 | Reservado | HW_WEB |
6 | ESP32-P4 | HW_ESP32P4 |
7 | ESP32-S31 | HW_ESP32S31 |
En lugar de comparar con el número, usa las constantes: se leen mejor.
var plat = platform()
if (plat == HW_ESP32 or plat == HW_ESP32S3 or plat == HW_ESP32P4 or plat == HW_ESP32S31) then
println("Ejecutando en un ESP32")
elsif (plat == HW_WIN32) then
println("Ejecutando en Windows")
else
println("Plataforma desconocida")
end
El valor 3 está reservado. Correspondía a la antigua VM para RISC-V sobre K210 (Kendryte/Maixduino), que se retiró al descontinuarse ese chip. No se reutilizará para ninguna plataforma nueva, de modo que ningún programa puede recibir ese valor. La constante HW_RISCV que lo nombraba ya no existe: si tu código la usaba, sustitúyela por la comprobación que corresponda. Las plataformas RISC-V que JARU admite hoy son el ESP32-P4 (HW_ESP32P4) y el ESP32-S31 (HW_ESP32S31).
El valor 5, HW_WEB, es el de una VM para el navegador, que la 0.9.7 no tiene: ningún programa lo recibe.
vmerror
vmerror() debería devolver el código del último error, pero no sirve para saber si algo ha fallado.
vmerror() devuelve siempre 0En la 0.9.7, vmerror() devuelve 0 aunque haya habido errores. Para detectar un error, usa try y catch: lo cuenta Errores y excepciones.
Codificación Base64
encode64
La función encode64 codifica una cadena de texto en Base64. Es útil para transmitir datos binarios en formatos de texto o para codificar credenciales.
var texto = "Hola Mundo"
var codificado = encode64(texto)
println(codificado) // SG9sYSBNdW5kbw==
decode64
La función decode64 decodifica una cadena en Base64 y devuelve el texto original.
var codificado = "SG9sYSBNdW5kbw=="
var decodificado = decode64(codificado)
println(decodificado) // Hola Mundo
Base64 es muy útil para enviar datos a través de protocolos que solo admiten texto, como HTTP o MQTT.
use MQTT
// Ejemplo: codificar datos de un sensor para enviarlos por MQTT
var datos = "temperatura:25.5,humedad:60"
var mensaje = encode64(datos)
MQTT.publish("sensores/datos", mensaje)
Constantes
Las conoce el compilador, y se pueden usar en cualquier fichero sin use:
| Constantes | Valor | Para qué |
|---|---|---|
HW_ESP32, HW_ESP32S3, HW_WIN32, HW_WEB, HW_ESP32P4, HW_ESP32S31 | 1, 2, 4, 5, 6 y 7 | Lo que devuelve platform(). |
tBool … tEnumerator | De 0 a 22 | Los tipos de type(). |
ERR_UNKNOWN … ERR_TIME_OUT | De 1 a 29 | Los errores: ver Errores y excepciones. |
LOW, HIGH | 0 y 1 | Los niveles de un pin: ver GPIO. |
PI | π: println(PI) escribe 3.141592653589793 | Ver Math. |
SQRT2 | √2: println(SQRT2) escribe 1.4142135623730951 | Ver Math. |
Ejemplo completo
Tira un dado 600 veces, cuenta cuántas veces sale cada cara y mide cuánto tarda:
// Con la misma semilla salen siempre las mismas tiradas.
randomize(2026)
var veces = [0, 0, 0, 0, 0, 0]
var inicio = clock()
for (var i = 0; i < 600; i = i + 1)
var cara = random(1, 6)
veces[cara - 1] = veces[cara - 1] + 1
end
var esperado = 600 div 6
for (var c = 1; c <= 6; c = c + 1)
var n = veces[c - 1]
println("Cara ", c, ": ", n, " veces (", abs(n - esperado), " de diferencia)")
end
println("Ha tardado ", clock() - inicio, " ms")
Cara 1: 100 veces (0 de diferencia)
Cara 2: 112 veces (12 de diferencia)
Cara 3: 109 veces (9 de diferencia)
Cara 4: 87 veces (13 de diferencia)
Cara 5: 97 veces (3 de diferencia)
Cara 6: 95 veces (5 de diferencia)
Ha tardado 2 ms
La última línea cambia de una ejecución a otra.
Trampas y problemas conocidos
- Sin
randomize,random()repite siempre la misma secuencia (ver randomize). printlnescribe las cifras que tiene el decimal:0.1 + 0.2sale0.30000000000000004, porque no es exactamente 0.3. Para enseñarlo redondeado, usatoString()(ver print / println).intyfloatno convierten cadenas: usatoInt()ytoFloat().lencuenta bytes en las cadenas, y no admite arrays.readLine()no recibe nada en las placas (ver readLine).inkypaperno hacen nada en Windows (ver ink / paper).time()con un código%que no existe cierra la VM en Windows (ver time).vmerror()devuelve siempre 0 (ver vmerror).type()con un valor de error descoloca la pila de la VM (ver type).
Todos los problemas conocidos de JARU, juntos, están en Problemas conocidos.