Saltar al contenido principal

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ónQué haceDevuelve
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​

WindowsESP32 / ESP32-S3ESP32-P4ESP32-S31
print, printlnEscriben 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()41 en el ESP32 y 2 en el S367
  • 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 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:

ValorCómo saleEjemplo
EnteroTal cual.120
DecimalCon 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
CadenaSin comillas.Ana
Booleano y nilCon su nombre.true, nil
Lista y mapaCon sus elementos; las cadenas, sin comillas.[1, dos, 3.5], {vidas: 3}
StructSu nombre y sus campos.Punto{x: 1, y: 2}
Instancia de una claseEl nombre de la clase.Gato instance
El error de un catchSu nombre y su mensaje.ERR_KEY_NOT_FOUND: The given key was not present in the map.
Valor de errorError y su número.Error 9
  • Para escribir un decimal con menos cifras, conviértelo antes con su método toString(), que usa 15: con var x = 0.1, println(x.toString()) escribe 0.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 escrito Precio: 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 placa

En 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:

ColorNombreColorNombre
0Negro8Gris oscuro
1Azul9Azul claro
2Verde10Verde claro
3Cian11Cian claro
4Rojo12Rojo claro (con ink, naranja)
5Magenta13Magenta claro
6Marrón14Amarillo
7Gris claro15Blanco

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 Windows

En 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: usa Display.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ódigoQué poneEjemplo
%YEl año.2026
%yEl año, con dos cifras.26
%mEl mes, de 01 a 12.11
%dEl día del mes, de 01 a 31.06
%eEl día del mes, con un espacio delante en vez del cero. 6
%HLa hora, de 00 a 23.18
%ILa hora, de 01 a 12.06
%pAM o PM.PM
%MEl minuto, de 00 a 59.35
%SEl segundo, de 00 a 59.13
%A, %aEl día de la semana, en inglés, entero o en tres letras.Friday, Fri
%B, %bEl mes, en inglés, entero o en tres letras.November, Nov
%jEl día del año, de 001 a 366.310
%uEl día de la semana en número, del 1 (lunes) al 7.5
%wEl día de la semana en número, del 0 (domingo) al 6.5
%FLa fecha: %Y-%m-%d.2026-11-06
%TLa hora: %H:%M:%S.18:35:13
%RLa hora y el minuto: %H:%M.18:35
%%Un %.%
  • El resultado puede tener hasta 79 caracteres. Si es más largo, en Windows time devuelve una cadena vacía.
  • En Windows, la fecha y la hora son las del PC. En una placa, las de su reloj (ver Plataformas).
Un código con % que no existe cierra la VM

En 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
ConstanteValorTipo
tBool0Un booleano: true o false.
tNil1nil.
tInteger2Un entero.
tFloat3Un decimal.
tError4El error de un catch, o un valor de error de una función que ha fallado.
tMethod6Un método de una instancia guardado en una variable, como var m = gato.maulla.
tClass7Una clase.
tFunction9Una función o una lambda.
tInstance10Una instancia de una clase.
tNative11Una función de la VM.
tString12Una cadena.
tList13Una lista.
tMap14Un mapa.
tArray15Un array.
tFile16Un fichero abierto con File.open.
tBitmap17Un bitmap, como el que devuelve Bitmap.load.
tModule18Un módulo, como Display o Display.draw.
tAbstract20Un objeto de un módulo: un sprite, un GridMap, un Bytes, una tira de LED…
tEnumerator22Un enum. Sus valores son enteros: tInteger.
  • Un struct da 23, y el struct mismo (su nombre, sin crear nada) da 24. No tienen constante.
  • type es 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
Sin randomize, siempre la misma secuencia

El 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:

LlamadaQué 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 decimalesUn 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) lanza ERR_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, usa random(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étodo size() (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:

ValorPlataformaConstante
0Plataforma desconocida—
1ESP32HW_ESP32
2ESP32-S3HW_ESP32S3
3Reservado—
4WindowsHW_WIN32
5ReservadoHW_WEB
6ESP32-P4HW_ESP32P4
7ESP32-S31HW_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
Nota

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 0

En 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
Uso común

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:

ConstantesValorPara qué
HW_ESP32, HW_ESP32S3, HW_WIN32, HW_WEB, HW_ESP32P4, HW_ESP32S311, 2, 4, 5, 6 y 7Lo que devuelve platform().
tBool … tEnumeratorDe 0 a 22Los tipos de type().
ERR_UNKNOWN … ERR_TIME_OUTDe 1 a 29Los errores: ver Errores y excepciones.
LOW, HIGH0 y 1Los niveles de un pin: ver GPIO.
PIπ: println(PI) escribe 3.141592653589793Ver Math.
SQRT2√2: println(SQRT2) escribe 1.4142135623730951Ver 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).
  • println escribe las cifras que tiene el decimal: 0.1 + 0.2 sale 0.30000000000000004, porque no es exactamente 0.3. Para enseñarlo redondeado, usa toString() (ver print / println).
  • int y float no convierten cadenas: usa toInt() y toFloat().
  • len cuenta bytes en las cadenas, y no admite arrays.
  • readLine() no recibe nada en las placas (ver readLine).
  • ink y paper no 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.