Introducción
Alvz es un lenguaje de programación de alto rendimiento basado en Python, diseñado para ser intuitivo y potente, con palabras clave en español. Permite crear aplicaciones conectadas a la nube y generar contenido web de forma nativa.
v0.18.0 — Compilador WASM con 40+ opcodes nativos + 42 host calls. Compatible con wasmtime 45. Memoria compartida entre módulo y host functions. StdLib (13 módulos: matematicas, cadenas, http, sqlite, json, csv, etc.), Package Manager (30 paquetes), LSP + DAP reales, 83 opcodes en VM. 626 tests, 0 fallos.
Plan de Aprendizaje Paso a Paso 🚀
Domina Alvz desde cero con este camino guiado, sin prisa pero sin pausa. Cada lección explica qué harás, los conceptos clave que aprenderás y un reto para practicar. ¡Tú pones el ritmo!
1. Primeros pasos
Qué harás: Escribir tu primer programa y entender cómo funciona Alvz.
Conceptos: Instalación, terminal, imprimir, variable, números y texto.
Reto: Crea un programa que imprima tu nombre y edad.
Empezar →2. Toma decisiones
Qué harás: Hacer que tu programa reaccione según condiciones.
Conceptos: si, sino, comparaciones (==, <, >), verdadero, falso.
Reto: Pide una edad al usuario y dile si es mayor o menor de edad.
Ver más →3. Repite sin aburrirte
Qué harás: Automatizar tareas repetitivas con bucles.
Conceptos: mientras, para, cada, rangos (de 1 a 10).
Reto: Imprime la tabla de multiplicar del 7 del 1 al 10.
Ver más →4. Organiza tu código
Qué harás: Crear bloques reutilizables con funciones.
Conceptos: funcion, parámetros, retornar, ámbito de variables.
Reto: Escribe una función que reciba un número y devuelva si es par o impar.
Ver más →5. Colecciones de datos
Qué harás: Guardar múltiples valores en listas y diccionarios.
Conceptos: [], {}, índices, longitud, agregar, bucles cada.
Reto: Crea una lista de compras, agrega 3 items, y muestra cada uno.
Ver más →6. Crea tus propios objetos
Qué harás: Modelar cosas del mundo real con clases.
Conceptos: clase, nuevo, inicializar(), self, métodos.
Reto: Crea una clase Libro con título, autor y un método mostrar().
7. Herencia y más POO
Qué harás: Reutilizar código con herencia y usar getters/setters.
Conceptos: clase ... de ..., super, instancia, propiedad, estatico.
Reto: Crea Vehiculo → Coche que herede y sobrescriba un método.
8. Librería Estándar
Qué harás: Usar módulos ya hechos para ahorrar tiempo.
Conceptos: importar, matematicas, cadenas, colecciones, fecha.
Reto: Importa matematicas y calcula el factorial de un número.
9. Archivos y JSON
Qué harás: Leer y escribir archivos, guardar datos en JSON.
Conceptos: sistema, archivo_leer, archivo_escribir, json.
Reto: Guarda una lista de tareas en un archivo JSON y luego léela.
Ver más →10. Consumir APIs
Qué harás: Obtener datos de internet con peticiones HTTP.
Conceptos: importar "http", http_obtener, http_json, JSON.
Reto: Obtén datos del clima de una API pública y muestra la temperatura.
Ver más →11. Async — haz varias cosas a la vez
Qué harás: Ejecutar tareas en paralelo sin bloquear tu programa.
Conceptos: funcion async, aguardar, esperar, concurrencia real.
Reto: Lanza 3 tareas async que esperen diferente tiempo y observa el orden.
Ver más →12. Paquetes de terceros
Qué harás: Instalar y usar paquetes del registro público.
Conceptos: alvz install, alvz search, registro de paquetes, dependencias.
Reto: Instala el paquete math y usa fibonacci(10).
13. SQLite — base de datos local
Qué harás: Guardar datos persistentes con SQLite sin instalar nada.
Conceptos: sqlite, base_abrir, base_crear_tabla, base_insertar, base_consultar.
Reto: Crea una tabla de contactos, inserta 3 y muéstralos.
Ver más →14. Compila y distribuye
Qué harás: Convertir tu programa en un .exe o .wasm para compartirlo.
Conceptos: alvz build, --nuitka, --wasm, ejecutable standalone.
Reto: Compila tu juego de adivinanza a .exe y pásalo a un amigo.
Ver más →15. Web con FastAPI
Qué harás: Crear un servidor web y una API REST desde Alvz.
Conceptos: iniciar_servidor, rutas, GET/POST, parámetros de ruta, JSON.
Reto: Crea una API que reciba un nombre y responda "Hola, {nombre}!".
Ver más →16. Supabase — tu app en la nube
Qué harás: Conectar tu app a una base de datos en la nube real.
Conceptos: supabase_insertar, supabase_consultar, PostgreSQL, API key.
Reto: Crea un contador de visitas que se guarde en Supabase.
Ver más →17. Tipado estático
Qué harás: Hacer tu código más seguro y predecible con tipos.
Conceptos: : numero, : texto, : booleano, --check-types, type checker.
Reto: Anota tipos en una función suma y verifica que funcione.
Ver más →18. Pruebas unitarias
Qué harás: Asegurarte de que tu código funciona con tests automáticos.
Conceptos: importar "testing", describir, probar, afirmar_igual, alvz test.
Reto: Escribe tests para una función que valide emails.
Ver más →19. Lambda y funcional
Qué harás: Escribir funciones anónimas y operar listas al estilo funcional.
Conceptos: funcion() {} como expresión, .mapear(), .filtrar(), callbacks.
Reto: Toma [1,2,3,4,5], filtra los pares y duplícalos con una lambda.
Ver más →20. Herramientas CLI
Qué harás: Usar el formateador, fixer, benchmarks y scaffolding de Alvz.
Conceptos: alvz fmt, alvz fix, alvz bench, alvz nuevo, alvz debug.
Reto: Genera un proyecto completo con alvz nuevo proyecto mi_app.
No necesitas seguir el orden al pie de la letra. Si algo te aburre, salta al siguiente tema y vuelve después. Lo importante es escribir código todos los días, aunque sean 10 minutos. ¡La práctica hace al maestro!
🧪 Practica cada lección
Selecciona un reto, escribe tu solución en Alvz y presiona Ejecutar para ver el resultado. Cuando creas que está bien, presiona Verificar.
Presiona "Ejecutar" para ver el resultado aquí.
Instalación
Alvz funciona en Windows, Linux y macOS. Hay varias formas de instalarlo.
Windows — Instalador
Descarga el ZIP con el instalador y la extensión de VS Code.
Descargar Instalador (.zip)- Windows 10 u 11
- No requiere Python instalado (el .exe es standalone)
Linux / macOS / Windows — vía PyPI
Alvz está disponible en PyPI (Python Package Index), el repositorio oficial de paquetes Python. Instálalo con un solo comando:
pip install alvz-lenguaje # Con soporte WebAssembly (wasmtime) pip install alvz-lenguaje[wasm] # Con servidor web (FastAPI) pip install alvz-lenguaje[web]
- Requiere Python 3.10+
- Disponible en pypi.org/project/alvz-lenguaje
- Con
alvz buildpuedes generar ejecutables standalone con PyInstaller
Verificar instalación
$ alvz --version Alvz v0.18.0
Extensión para VS Code
Mejora tu experiencia de desarrollo con resaltado semántico, autocompletado real y más de 60 snippets inteligentes para Alvz.
Resaltado semántico: Variables, funciones, clases, keywords, strings, números, builtins, propiedades y comentarios se colorean según su rol en el código, no solo por sintaxis.
Autocompletado real: Sugiere keywords, estructuras completas vía snippets, funciones de la StdLib con parámetros, constantes y módulos stdlib al escribir importar "...".
Snippets para Supabase, API REST, CRUD, archivos, JSON, async/paralelo, POO, menús, validación, fecha/hora, regex, listas, errores y más.
Instalación
Disponible directamente en el Marketplace de VS Code. Dos formas de instalar:
Opción 1 — Desde el Marketplace:
- Abre VS Code
- Ve a la sección de Extensiones (Ctrl+Shift+X)
- Busca "Alvz en Español"
- Haz clic en Instalar
Opción 2 — Desde el navegador:
- Visita marketplace.visualstudio.com
- Haz clic en Install
Nota: También puedes descargar el archivo .vsix desde el instalador (.zip) e instalarlo manualmente si no tienes acceso al Marketplace.
Características
- Resaltado Semántico: El editor entiende el rol de cada token — variables declaradas con
variable, funciones definidas confuncion, clases, builtins de la StdLib y más — y los colorea con precisión. - Autocompletado Contextual: Sugiere keywords del lenguaje, snippets con Tab, funciones de la StdLib con firmas, constantes (
verdadero,falso,nulo) y módulos stdlib al escribirimportar "...". - 60+ Snippets Inteligentes: Escribe
funcion,si,para,clase,async,servidor,supabase,crud,menu,apiy presiona Tab para autocompletar la estructura completa. - Soporte FastAPI & Supabase: Resaltado especial para funciones de servidor y base de datos.
Snippets incluidos
| Categoría | Prefix | Descripción |
|---|---|---|
| Supabase | supabase, supainsert, supacrud | Conexión, inserción y API CRUD con Supabase |
| API/FastAPI | servidor, api, apijson | Servidor REST, rutas GET/POST, persistencia JSON |
| CRUD | crud | CRUD completo en memoria (crear, listar, actualizar, eliminar) |
| Archivos | leerarchivo, escribirarchivo | Lectura y escritura de archivos |
| JSON | jsonenc, jsondec | Codificar y decodificar JSON |
| HTTP | enviarweb | Enviar peticiones HTTP POST |
| Async | asyncpar | Ejecución paralela de corutinas |
| POO | claseh, persona, propiedad, estatico | Herencia, propiedades, métodos estáticos |
| Validación | validaremail, validarreq | Validación de email y campos requeridos |
| Fecha/Hora | fecha, timestamp | Formateo de fecha y timestamp Unix |
| Listas | filtrar, mapear, ordenar, contar | Operaciones funcionales sobre listas |
| Texto | dividir, unir, regex, reemplazar | Manipulación de cadenas |
| Errores | intentar, lanzar | Bloques try-catch |
| Menús | menu | Menú interactivo por consola |
| Utilidades | leer, azar, tipo, potencia, salida, base | Entrada, aleatorios, tipos, matemáticas, script base |
Glosario de Palabras Reservadas
En Alvz, el código se lee casi como una oración en español. Aquí tienes las palabras que el lenguaje usa para entenderte:
| Categoría | Palabras Clave | Propósito |
|---|---|---|
| Lógica | si, sino, mientras, para, cada |
Controlan el flujo del programa. |
| Conectores | de, a, en |
Ayudan a leer bucles: para i de 1 a 10. |
| Definiciones | variable, funcion, clase, nuevo, super, propiedad, estatico |
Crean nuevos elementos y acceden a la clase padre. |
| Valores | verdadero, falso, nulo |
Valores booleanos y nulo. |
| Lógica | y, o, instancia |
Operadores lógicos y verificación de tipo. |
Hola Mundo
Compara cómo se ve el mismo código en Alvz y en Python:
variable mensaje = "¡Hola desde Alvz!" imprimir(mensaje)
mensaje = "¡Hola desde Alvz!"
print(mensaje)
Ejecútalo desde la terminal:
$ alvz inicio.alvz ¡Hola desde Alvz!
Variables y Tipos
Alvz es dinámicamente tipado con soporte opcional de anotaciones de tipo estáticas.
Tipos de datos
| Tipo | Ejemplo |
|---|---|
| Texto | "Hola Mundo" |
| Número | 10 o 3.14 |
| Booleano | verdadero o falso |
| Nulo | nulo |
| Lista | [1, 2, 3] |
| Diccionario | {"clave": "valor"} |
Anotaciones de tipo (opcionales)
Puedes declarar el tipo esperado de una variable usando : después del nombre.
variable x: numero = 5 variable s: texto = "hola" variable b: booleano = verdadero variable n: nulo = nulo
Tipado Estático
Alvz incluye un verificador de tipos estático opcional que analiza tu código en tiempo de compilación. Se activa con --check-types o -T.
Anotaciones en variables
Puedes declarar el tipo de una variable usando : después del nombre.
variable x: numero = 5 variable nombre: texto = "Alvz" variable activo: booleano = verdadero
Anotaciones en funciones
Puedes anotar tipos en parámetros y valor de retorno. El verificador valida que los argumentos coincidan.
funcion suma(a: numero, b: numero): numero { retornar a + b } # Error en compilacion: variable x: texto = suma(1, 2) # esperaba texto, encontro numero
5, sabe que es numero. Sin anotaciones, no hay verificación.
Tipos disponibles
numero— enteros y decimalestexto— cadenasbooleano— verdadero/falsonulo— valor nulolista— arreglos dinámicosdiccionario— mapas clave-valorfuncion— funciones como valorcualquiera— tipo dinámico (predeterminado)
Funciones
Las funciones te permiten reutilizar bloques de código. Compara la sintaxis:
funcion sumar(a: numero, b: numero): numero { retornar a + b } variable resultado = sumar(10, 5) imprimir(resultado)
def sumar(a, b):
return a + b
resultado = sumar(10, 5)
print(resultado)
Funciones Anónimas (Lambdas)
Las funciones anónimas (también llamadas lambdas) permiten definir funciones sin nombre como expresiones. Son ideales para callbacks, operaciones sobre listas y composición funcional.
Sintaxis
Una función anónima se define con la palabra clave funcion seguida de parámetros y cuerpo entre llaves, todo como una expresión:
funcion(a, b) { retornar a + b }
Asignación a variable
variable suma = funcion(a, b) { retornar a + b } imprimir(suma(3, 4)) # 7
Uso como argumento (callbacks)
funcion aplicar_operacion(x, y, operacion) { retornar operacion(x, y) } variable resultado = aplicar_operacion(10, 5, funcion(a, b) { retornar a * b }) imprimir(resultado) # 50
Con listas: mapear y filtrar
Las lambdas son especialmente útiles al trabajar con listas:
variable numeros = [1, 2, 3, 4, 5] # Mapear: doblar cada valor variable dobles = numeros.mapear(funcion(n) { retornar n * 2 }) imprimir(dobles) # [2, 4, 6, 8, 10] # Filtrar: solo pares variable pares = numeros.filtrar(funcion(n) { retornar n % 2 == 0 }) imprimir(pares) # [2, 4]
Clases y Objetos (POO)
Alvz soporta programación orientada a objetos con sintaxis limpia en español.
Definición básica
self se agrega automáticamente como primer parámetro. No necesitas declararlo.
clase Persona { variable nombre = "" funcion saludar() { imprimir("Hola, soy " + self.nombre) } } variable p = nuevo Persona() p.nombre = "Juan" p.saludar()
class Persona:
def __init__(self):
self.nombre = ""
def saludar(self):
print("Hola, soy " + self.nombre)
p = Persona()
p.nombre = "Juan"
p.saludar()
Constructor con argumentos
Define inicializar() para recibir argumentos al crear la instancia.
clase Punto { variable x = 0 variable y = 0 funcion inicializar(x, y) { self.x = x self.y = y } } variable p = nuevo Punto(10, 20) imprimir(p.x)
Propiedades con expresiones
Las propiedades pueden inicializarse con cualquier expresión, no solo con valores simples.
clase Caja { variable items = [1, 2, 3] variable total = 5 + 10 } variable c = nuevo Caja() imprimir(c.items) imprimir(c.total)
Herencia
Usa clase Hijo de Padre para heredar propiedades y métodos.
clase Animal { variable nombre = "" funcion inicializar(nombre) { self.nombre = nombre } funcion saludar() { retornar "Soy " + self.nombre } } clase Perro de Animal { funcion ladrar() { retornar "Guau!" } } variable p = nuevo Perro("Rex") imprimir(p.saludar()) imprimir(p.ladrar())
super e instanceof
Alvz soporta dos características clave de POO avanzado: llamadas a métodos de la clase padre y verificación de tipo en tiempo de ejecución.
super.metodo()
Llama explícitamente a un método de la clase padre desde una clase hija.
clase Animal { funcion saludar() { retornar "Hola, soy un animal" } } clase Perro de Animal { funcion saludar() { retornar super.saludar() + " (perro)" } } variable p = nuevo Perro() imprimir(p.saludar()) # "Hola, soy un animal (perro)"
obj instancia Clase
Verifica si un objeto es una instancia de una clase (o de sus clases padre).
clase Animal {} clase Perro de Animal {} variable p = nuevo Perro() imprimir(p instancia Perro) # verdadero imprimir(p instancia Animal) # verdadero (hereda) imprimir(p instancia Texto) # falso imprimir(42 instancia Perro) # falso (no es objeto)
instancia recorre toda la cadena de padres. Si alguna clase en la jerarquía coincide, devuelve verdadero.
Getters y Setters
Define propiedades calculadas con acceso controlado usando la sintaxis propiedad.
clase Persona { variable _nombre = "" propiedad nombre { obtener { retornar mayusculas(self._nombre) } establecer(valor) { self._nombre = valor } } funcion inicializar(nombre) { self._nombre = nombre } } variable p = nuevo Persona("juan") imprimir(p.nombre) # "JUAN" (getter aplica mayusculas) p.nombre = "maria" imprimir(p.nombre) # "MARIA"
Los getters y setters soportan herencia. Una clase hija puede heredar propiedades con getter/setter de la clase padre.
Métodos Estáticos
Define métodos que pertenecen a la clase, no a la instancia, usando funcion estatico.
clase Matematicas { funcion estatico cuadrado(n) { retornar n * n } funcion estatico pi() { retornar 3.1416 } } imprimir(Matematicas.cuadrado(5)) # 25 imprimir(Matematicas.pi()) # 3.1416
Los métodos estáticos se llaman directamente desde la clase, sin necesidad de crear una instancia con nuevo.
Control de Flujo
Alvz soporta las estructuras de control clásicas para tomar decisiones y repetir tareas.
Condicionales (si / sino)
si edad >= 18 { imprimir("Eres mayor de edad") } sino { imprimir("Eres menor de edad") }
Bucles (mientras / para)
Alvz ofrece bucles potentes, incluyendo iteración sobre rangos y listas.
# Bucle mientras variable i = 1 mientras i <= 5 { imprimir(i) i = i + 1 } # Bucle para (rango) para j de 1 a 5 { imprimir(j) } # Bucle para cada (listas) variable colores = ["rojo", "verde", "azul"] para cada c en colores { imprimir(c) }
global keyword
La palabra clave global permite declarar y modificar variables globales dentro del ámbito de una función.
Declaración
Usa global para indicar que una variable pertenece al ámbito global:
variable contador = 0 funcion incrementar() { global contador contador = contador + 1 } incrementar() imprimir(contador) # 1
Lectura y escritura
Sin global, una función crea una variable local al asignar. Con global, lee y escribe la variable del ámbito global:
variable mensaje = "Hola" funcion cambiar_mensaje() { global mensaje mensaje = "Mundo" } cambiar_mensaje() imprimir(mensaje) # "Mundo"
Asignación compuesta
variable total = 100 funcion agregar(valor) { global total total += valor } agregar(50) imprimir(total) # 150
Múltiples variables globales
Puedes declarar varias variables globales en una sola línea:
variable x = 1 variable y = 2 variable z = 3 funcion reiniciar() { global x, y, z x = 0 y = 0 z = 0 } reiniciar() imprimir(x, y, z) # 0 0 0
Desarrollo Web con FastAPI Pro
Alvz soporta ahora la potencia completa de FastAPI, permitiendo parámetros de ruta, diferentes métodos HTTP y recepción de datos JSON.
API REST Completa
# Función con parámetro de ruta {id} funcion obtener_usuario(id) { retornar {"id": id, "nombre": "Usuario " + id} } # Función para POST con datos del Body funcion crear(nombre, precio) { retornar {"estado": "ok", "nombre": nombre} } variable rutas = { "/usuarios/{id}": "obtener_usuario", "/items": {"metodo": "POST", "funcion": "crear"} } iniciar_servidor(8000, rutas)
from fastapi import FastAPI
app = FastAPI()
@app.get("/usuarios/{id}")
async def obtener_usuario(id: str):
return {"id": id, "nombre": f"Usuario {id}"}
@app.post("/items")
async def crear(item: dict):
return {"estado": "ok", "nombre": item.get("nombre")}
import uvicorn
uvicorn.run(app, port=8000)
Python Power: Características Avanzadas
Alvz hereda las características más potentes de Python. Mira las diferencias:
Herencia
clase Perro de Animal { funcion inicializar() { self.tipo = "Canino" } }
class Perro(Animal):
def __init__(self):
self.tipo = "Canino"
Slicing
imprimir(lista[1:4]) imprimir(texto[0:4])
print(lista[1:4]) print(texto[0:4])
Integración con Supabase
Conecta tu app a la nube en segundos. Alvz permite interactuar con bases de datos PostgreSQL a través de la API de Supabase sin configuraciones complejas.
variable url = "https://tu-proyecto.supabase.co" variable key = "tu-anon-key" # Insertar datos variable datos = {"usuario": "alvz_user", "puntos": 100} variable status = supabase_insertar(url, key, "ranking", datos) # Consultar datos variable resultado = supabase_consultar(url, key, "ranking") imprimir(resultado)
Módulos (importar)
Divide tu código en archivos para una mejor organización. También puedes importar módulos de la librería estándar.
Importar un archivo local
importar "calculos.alvz" variable r = calcular_total(100, 15) imprimir(r)
Importar de la librería estándar
importar "matematicas" imprimir(factorial(5)) # 120 imprimir(maximo(10, 20)) # 20
Importar desde paquetes instalados
Los paquetes instalados con alvz install se importan igual que los módulos de la StdLib:
importar "http" variable resp = http_obtener("https://api.example.com") imprimir(resp)
Librería Estándar (StdLib)
Alvz incluye módulos reutilizables que puedes importar con importar "nombre".
matematicas
| Función | Descripción |
|---|---|
factorial(n) | Calcula el factorial de n. |
maximo(a, b) | Devuelve el mayor de dos números. |
minimo(a, b) | Devuelve el menor de dos números. |
promedio(lista) | Calcula el promedio de una lista de números. |
es_par(n) | Devuelve verdadero si n es par. |
es_impar(n) | Devuelve verdadero si n es impar. |
importar "matematicas" imprimir(factorial(5)) # 120 imprimir(maximo(10, 20)) # 20 imprimir(promedio([1,2,3])) # 2
cadenas
| Función | Descripción |
|---|---|
reversa(texto) | Invierte el texto. |
capitalizar(texto) | Pone la primera letra en mayúscula. |
contiene(texto, subcadena) | Verifica si un texto contiene una subcadena. |
empieza_con(texto, prefijo) | Verifica si un texto empieza con un prefijo. |
termina_con(texto, sufijo) | Verifica si un texto termina con un sufijo. |
recortar(texto) | Elimina espacios al inicio y final. |
importar "cadenas" imprimir(reversa("Hola")) # aloH imprimir(capitalizar("hola")) # Hola imprimir(contiene("Hola Mundo", "Mundo")) # verdadero imprimir(recortar(" texto ")) # "texto"
colecciones
| Función | Descripción |
|---|---|
vacio(lista) | Verifica si una lista está vacía. |
primero(lista) | Devuelve el primer elemento. |
ultimo(lista) | Devuelve el último elemento. |
contiene(lista, elem) | Verifica si un elemento está en la lista. |
sin_duplicados(lista) | Elimina elementos duplicados. |
invertir(lista) | Invierte el orden de la lista. |
importar "colecciones" imprimir(primero([10, 20, 30])) # 10 imprimir(ultimo([10, 20, 30])) # 30 imprimir(contiene([1, 2, 3], 2)) # verdadero imprimir(sin_duplicados([1, 1, 2])) # [1, 2]
http
Cliente HTTP para consumir APIs REST. Los métodos devuelven un diccionario con codigo, cuerpo y json.
| Función | Descripción |
|---|---|
http_obtener(url, params) | Realiza una petición GET con parámetros opcionales. |
http_post(url, datos) | Realiza una petición POST con datos JSON. |
http_put(url, datos) | Realiza una petición PUT con datos JSON. |
http_eliminar(url) | Realiza una petición DELETE. |
http_exito(respuesta) | Devuelve verdadero si el código es 2xx. |
http_cuerpo(respuesta) | Obtiene el cuerpo como texto. |
http_json(respuesta) | Obtiene la respuesta parseada como JSON. |
importar "http" variable resp = http_obtener("https://api.github.com", {}) si http_exito(resp) { variable datos = http_json(resp) imprimir(datos) }
fecha
Funciones para obtener y formatear fecha/hora actual.
| Función | Descripción |
|---|---|
ahora() | Devuelve fecha y hora actual: YYYY-MM-DD HH:MM:SS. |
hoy() | Devuelve fecha actual: YYYY-MM-DD. |
hora_actual() | Devuelve hora actual: HH:MM:SS. |
timestamp_actual() | Devuelve el timestamp Unix actual en segundos. |
formatear_fecha(formato) | Formatea la fecha actual con el formato dado. |
anio_actual() | Devuelve el año actual. |
mes_actual() | Devuelve el mes actual. |
dia_actual() | Devuelve el día actual. |
importar "fecha" imprimir(ahora()) # 2026-05-27 12:00:00 imprimir(dia_actual()) # 27 imprimir(formatear_fecha("%d/%m/%Y")) # 27/05/2026
testing
Framework de pruebas unitarias para testear tu código Alvz.
| Función | Descripción |
|---|---|
describir(nombre) | Inicia un grupo de tests con nombre descriptivo. |
probar(nombre, funcion) | Ejecuta una prueba. Si falla, captura el error y continua. |
afirmar(condicion, msj) | Lanza error si la condición es falso. |
afirmar_igual(a, b, msj) | Lanza error si a != b. |
afirmar_diferente(a, b, msj) | Lanza error si a == b. |
afirmar_error(funcion, msj) | Verifica que una función lance un error con el mensaje esperado. |
resumen() | Muestra total de tests, exitos y fallos. |
importar "testing" describir("Matematicas") probar("suma funciona", funcion() { afirmar_igual(5, 2 + 3, "2+3=5") }) probar("division", funcion() { afirmar_igual(2, 10 / 5, "10/5=2") }) resumen()
sistema
Operaciones del sistema: archivos, JSON, rutas.
| Función | Descripción |
|---|---|
archivo_existe(ruta) | Verifica si un archivo existe. |
archivo_leer(ruta) | Lee el contenido de un archivo. |
archivo_escribir(ruta, cont) | Escribe contenido en un archivo. |
archivo_copiar(origen, dest) | Copia un archivo. |
json_a_texto(datos) | Convierte un diccionario/lista a texto JSON. |
texto_a_json(texto) | Convierte texto JSON a diccionario/lista. |
archivo_leer_json(ruta) | Lee y parsea un archivo JSON. |
archivo_escribir_json(ruta, datos) | Convierte a JSON y guarda en archivo. |
importar "sistema" variable datos = {"nombre": "Alvz", "version": 1} archivo_escribir_json("datos.json", datos) variable leido = archivo_leer_json("datos.json") imprimir(leido["nombre"]) # Alvz
sqlite
Base de datos SQLite embebida para persistencia local.
| Función | Descripción |
|---|---|
base_abrir(ruta) | Abre (o crea) una base de datos SQLite. |
base_ejecutar(conn, sql) | Ejecuta una sentencia SQL (INSERT, UPDATE, DELETE). |
base_consultar(conn, sql) | Ejecuta una consulta SELECT, devuelve lista de registros. |
base_crear_tabla(conn, nom, cols) | Crea una tabla con las columnas especificadas. |
base_insertar(conn, tabla, datos) | Inserta un diccionario como fila en la tabla. |
base_seleccionar(conn, tabla, cond) | Selecciona registros con condición WHERE opcional. |
base_cerrar(conn) | Cierra la conexión a la base de datos. |
importar "sqlite" variable db = base_abrir("ejemplo.db") base_crear_tabla(db, "usuarios", ["id INTEGER PRIMARY KEY", "nombre TEXT", "edad INTEGER"]) base_insertar(db, "usuarios", {"id": 1, "nombre": "Ana", "edad": 30}) variable resultados = base_seleccionar(db, "usuarios", "") cada r en resultados { imprimir(r["nombre"]) # Ana } base_cerrar(db)
aleatorio
Números aleatorios, selección y mezcla de colecciones, generación de cadenas aleatorias.
| Función | Descripción |
|---|---|
aleatorio_numero(min, max) | Devuelve un entero aleatorio entre min y max (inclusive). |
aleatorio_flotante(min, max) | Devuelve un número decimal aleatorio entre min y max. |
aleatorio_escoger(lista) | Selecciona un elemento al azar de la lista. |
aleatorio_escoger_varios(lista, n) | Selecciona n elementos distintos al azar. |
aleatorio_mezclar(lista) | Devuelve una copia de la lista con elementos reordenados aleatoriamente. |
aleatorio_cadena(longitud) | Genera una cadena alfanumérica aleatoria de la longitud dada. |
aleatorio_booleano() | Devuelve verdadero o falso al azar. |
importar "aleatorio" variable dado = aleatorio_numero(1, 6) variable cartas = ["A", "K", "Q", "J"] variable mano = aleatorio_escoger_varios(cartas, 2) variable token = aleatorio_cadena(16) imprimir(dado, mano, token)
csv
Lectura y escritura de archivos CSV con soporte para formato de diccionarios y listas.
| Función | Descripción |
|---|---|
csv_a_listas(texto) | Parsea texto CSV y devuelve una lista de listas. |
csv_a_diccionarios(texto) | Parsea texto CSV usando la primera fila como encabezados, devuelve lista de diccionarios. |
csv_leer(ruta) | Lee un archivo CSV y devuelve lista de diccionarios. |
csv_listas_a_texto(datos) | Convierte una lista de listas a texto CSV. |
csv_diccionarios_a_texto(datos) | Convierte una lista de diccionarios a texto CSV. |
csv_escribir(ruta, datos) | Guarda una lista de diccionarios como archivo CSV. |
importar "csv" importar "sistema" variable usuarios = [ {"nombre": "Ana", "edad": "30"}, {"nombre": "Bob", "edad": "25"} ] csv_escribir("usuarios.csv", usuarios) variable datos = csv_leer("usuarios.csv") cada u en datos { imprimir(u["nombre"]) }
expresiones_regulares
Validación y extracción de patrones con expresiones regulares.
| Función | Descripción |
|---|---|
regex_coincide(texto, patron) | Devuelve verdadero si el patrón aparece al menos una vez. |
regex_extraer(texto, patron) | Devuelve la primera coincidencia del patrón, o cadena vacía. |
regex_todas(texto, patron) | Devuelve una lista con todas las coincidencias. |
regex_contar(texto, patron) | Cuenta cuántas veces aparece el patrón en el texto. |
importar "expresiones_regulares" variable email = "usuario@ejemplo.com" si regex_coincide(email, "^.+@.+\\..+$") { imprimir("Email válido") } variable texto = "precio: $10, $20, $30" imprimir(regex_todas(texto, "\\$\\d+")) # ["$10", "$20", "$30"]
consola
Utilidades interactivas para terminal: menús, confirmaciones, colores y barras de progreso.
| Función | Descripción |
|---|---|
consola_color(texto, color) | Envuelve el texto en códigos ANSI del color especificado (rojo, verde, azul, etc.). |
consola_preguntar(pregunta) | Muestra una pregunta y devuelve la respuesta del usuario. |
consola_confirmar(pregunta) | Muestra una pregunta de sí/no y devuelve verdadero o falso. |
consola_menu(titulo, opciones) | Muestra un menú numerado y devuelve la opción seleccionada. |
consola_progreso(actual, total, ancho) | Genera una barra de progreso visual como texto. |
consola_separador() | Imprime una línea separadora. |
consola_titulo(texto) | Imprime un título formateado. |
importar "consola" variable nombre = consola_preguntar("¿Cómo te llamas?") si consola_confirmar("¿Quieres continuar?") { variable opcion = consola_menu("Elige:", ["Opción A", "Opción B"]) imprimir(consola_color("Listo", "verde")) }
json
Codificación y decodificación JSON, validación y lectura/escritura de archivos.
| Función | Descripción |
|---|---|
json_a_texto(datos) | Convierte un diccionario o lista a cadena JSON. |
texto_a_json(texto) | Convierte una cadena JSON a diccionario o lista. |
json_leer_archivo(ruta) | Lee y parsea un archivo JSON. |
json_escribir_archivo(ruta, datos) | Convierte datos a JSON y los guarda en un archivo. |
json_valido(texto) | Devuelve verdadero si el texto es JSON válido. |
importar "json" variable datos = {"nombre": "Ana", "edad": 30} variable texto = json_a_texto(datos) imprimir(texto) # {"nombre": "Ana", "edad": 30} variable recuperado = texto_a_json(texto) imprimir(recuperado["nombre"]) # Ana
Funciones incorporadas
| Función | Descripción |
|---|---|
leer() |
Lee una entrada del usuario (texto o número). |
leer_numero() |
Lee una entrada y obliga al usuario a ingresar un número válido. |
tiempo() |
Obtiene el tiempo actual en segundos (Unix timestamp). |
tipo(valor) |
Devuelve el tipo de dato (texto, numero, booleano, lista, diccionario, nulo). |
json_codificar(v) |
Convierte una lista o diccionario a una cadena JSON. |
reemplazar(t, v, n) |
Reemplaza en el texto t todas las ocurrencias de v por n. |
absoluto(n) |
Devuelve el valor absoluto de un número. |
azar(min, max) |
Genera un número aleatorio entre el rango dado. |
importar "matematicas" importar "fecha" importar "aleatorio" importar "json" imprimir(factorial(5)) # 120 imprimir(ahora()) # "2026-05-27 12:00:00" variable token = aleatorio_cadena(16) imprimir(json_a_texto({"token": token})) # {"token": "a3f8..."}
Async / Await
Alvz soporta programación asíncrona con las palabras clave async y aguardar. Las funciones marcadas como async se ejecutan mediante un event loop real con threads, permitiendo concurrencia verdadera.
funcion async obtener_datos(id) { retornar id * 2 } variable resultado = aguardar obtener_datos(5) imprimir(resultado) # 10
Concurrencia real
Múltiples tareas async se ejecutan en paralelo usando ThreadPoolExecutor. Ejemplo con esperar():
funcion async tarea(n, segundos) { imprimir("Inicia tarea " + n) esperar(segundos) imprimir("Termina tarea " + n) } aguardar tarea("A", 0.5) aguardar tarea("B", 0.3)
Sintaxis
- Función async:
funcion async nombre(args) { cuerpo }— define una función que devuelve una corutina. - Aguardar:
aguardar expresion— ejecuta una corutina y espera su resultado.
aguardar puede usarse tanto en expresiones (asignación) como en sentencias (llamada directa):
// Como expresión variable x = aguardar foo() // Como sentencia aguardar foo()
ThreadPoolExecutor para lanzar corutinas en threads separados. Las tareas con esperar() se ejecutan verdaderamente en paralelo.
Optimizador de Bytecode
Alvz incluye un optimizador de bytecode que mejora el rendimiento de tus programas. Se activa con la bandera --optimize o -O al ejecutar un archivo.
$ alvz --optimize script.alvz
Ejecución WebAssembly
Alvz puede ejecutar archivos directamente via WebAssembly con --wasm, usando wasmtime en vez de la VM Python. 37 opcodes se ejecutan como WASM nativo y el resto via host calls.
$ alvz --wasm programa.alvz # Ejecuta via WASM (requiere wasmtime)
Para scripts sin clases ni imports complejos, WASM ofrece velocidad nativa con 37+ opcodes compilados directamente a instrucciones WASM. Los opcodes restantes se manejan como host calls desde Python.
Optimizaciones
- Plegado de constantes (Constant Folding): Evalúa expresiones aritméticas y lógicas con operandos constantes en tiempo de compilación. Ejemplo:
2 + 3se convierte en5antes de ejecutar. - Eliminación de código muerto: Remueve instrucciones después de
OP_HALTque nunca se ejecutarán. - Reasignación de saltos: Actualiza direcciones de salto automáticamente tras las optimizaciones.
Compatibilidad
El optimizador es completamente transparente: el programa produce el mismo resultado con o sin --optimize. La diferencia está en la velocidad de ejecución y el tamaño del bytecode.
Package Manager
Alvz incluye un gestor de paquetes para instalar y compartir librerías. Los paquetes se obtienen del registro público en github.com/interpago/alvz-packages.
Paquetes disponibles
Actualmente hay 30 paquetes en el registro:
| Paquete | Versión | Descripción |
|---|---|---|
base-convert | 1.0.0 | Conversión de bases: binario, octal, hexadecimal |
collections | 1.0.0 | Operaciones con listas: agrupar, ordenar, unique, aplanar |
color-utils | 1.0.0 | Colores terminal ANSI: rojo, verde, azul, negrita, subrayado |
crypto | 1.0.0 | Utilidades crypto: base64, hash simple, IDs, sanitización HTML |
csv-extra | 1.0.0 | CSV con tipos automáticos: parsear con detección de números |
datos | 1.0.0 | Procesamiento tabular: CSV, filtrar, seleccionar columnas |
date-utils | 1.0.0 | Cálculos de fechas: sumar días, diferencia, timestamp |
file-utils | 1.0.0 | Operaciones avanzadas de archivos: glob, mover, temporales |
fs-extra | 1.0.0 | Operaciones de archivos: directorios, estadísticas, copiar |
html-utils | 1.0.0 | Generación HTML: tablas, listas, enlaces, escape |
ini-utils | 1.0.0 | Parseo INI: leer y generar archivos de configuración |
json-utils | 1.0.0 | Utilidades JSON: merge, diff, patch, validar esquemas |
markdown | 1.0.0 | Generación Markdown: encabezados, listas, tablas, código |
math | 1.0.0 | Funciones matemáticas: fibonacci, primos, combinatoria |
math-extra | 1.0.0 | Matemáticas adicionales: MCD, MCM, factorial, permutaciones |
path-utils | 1.0.0 | Manipulación de rutas: join, dirname, basename, extension |
random-utils | 1.0.0 | Aleatorias: choice, shuffle, sample, weighted choice |
retry | 1.0.0 | Reintentos: backoff, respaldo, condicional |
semver | 1.0.0 | Versionado semántico: parsear, comparar, compatible |
slugify | 1.0.0 | Generación de slugs URL a partir de textos |
stats | 1.0.0 | Estadísticas: media, mediana, moda, varianza, desviación |
strings | 1.0.0 | Manipulación de textos: invertir, capitalizar, palíndromos |
template | 1.0.0 | Plantillas simples: render, repetir, reemplazar |
text-utils | 1.0.0 | Utilidades de texto: wrap, indent, center, tabular |
throttle | 1.0.0 | Rate limiting: throttle, espera, rate limiter |
tiempo | 1.0.0 | Formateo de fecha/hora: timestamps, bisiestos, días entre fechas |
unit-convert | 1.0.0 | Conversión de unidades: temperatura, distancia, peso, volumen |
validacion | 1.0.0 | Validación de datos: email, teléfono, URL, rangos, longitud |
xml-utils | 1.0.0 | Generación XML: escape, elementos, documentos |
yaml-utils | 1.0.0 | Serialización YAML: diccionarios y listas a YAML |
Instalación
$ alvz install math # Instala la última versión $ alvz install json-utils # Utilidades JSON $ alvz install fs-extra@1.0.0 # Versión específica $ alvz search json # Busca paquetes relacionados
Comandos
| Comando | Descripción |
|---|---|
alvz install <paquete>[@version] | Instala un paquete (con versión opcional) |
alvz uninstall <paquete> | Desinstala un paquete |
alvz search <consulta> | Busca paquetes en el registro |
alvz list-packages | Lista paquetes instalados |
alvz info <paquete> | Muestra información detallada de un paquete |
alvz debug <archivo> | Depuración con DAP (breakpoints, paso a paso, variables) |
Instalación de paquetes
$ alvz install stats # Estadísticas $ alvz install html-utils # Generación HTML $ alvz install semver # Versionado semántico $ alvz install retry # Reintentos $ alvz list-packages # Ver instalados
$ alvz list-packages $ alvz info math $ alvz uninstall json-utils
Los paquetes se instalan en ~/.alvz/packages/ y pueden importarse con importar "nombre".
Uso desde código
# Después de instalar un paquete: importar "strings" importar "stats" importar "html-utils" variable texto = "Hola Mundo" imprimir(invertir(texto)) # odnuM aloH variable nums = [4, 7, 1, 9, 3] imprimir(media(nums)) # 4.8
index.json en ese repositorio. ¡Puedes contribuir con tus propios paquetes!
Compilación Nativa & Multiplataforma
Alvz genera ejecutables independientes mediante alvz build que funcionan en Windows, Linux y macOS. Todos los 83 opcodes del VM están soportados: clases, SQLite, HTTP, lambdas, async/await, etc. Los binarios se empaquetan con PyInstaller y no requieren dependencias externas.
$ alvz build programa.alvz $ ./programa
Cómo funciona
- El código fuente Alvz se compila a bytecode
- El bytecode se empaqueta con el VM Python vía PyInstaller
- Se genera un ejecutable standalone para la plataforma actual
funcion suma(a: numero, b: numero): numero { retornar a + b } variable x = suma(10, 20) imprimir(x)
Compilación WASM
Alvz puede compilar tu código a WebAssembly (WASM), permitiendo ejecutar programas Alvz en cualquier runtime WASM como wasmtime, wasmer o en el navegador web.
$ alvz build --wasm programa.alvz $ wasmtime programa.wasm
Opcodes Soportados (40+/83)
| Categoría | Opcodes |
|---|---|
| Aritmética | + - * /, negación unaria |
| Comparaciones | == != < > <= >= |
| Lógica | y (AND), o (OR) |
| Variables | load, store, load_global, store_global |
| Control | jump, jump_if_false, call, return, halt |
| IO | print (numérico, booleano, string), leer() |
| Aleatorio | azar(min, max) |
| Listas | crear, agregar, obtener índice, establecer índice, longitud |
| Diccionarios | crear (placeholder) |
| Valores | constante, null, pop |
funcion suma(a: numero, b: numero): numero { retornar a + b } variable x = suma(10, 20) imprimir(x)
$ alvz build --wasm programa.alvz # Genera programa.wasm $ wasmtime programa.wasm # 30
Arquitectura Interna de Alvz
Alvz está construido sobre una arquitectura modular de 6 capas que transforman código fuente en ejecución. A continuación se explica cada componente clave del lenguaje.
Pipeline de Compilación
# 1. Lexer Código .alvz → Tokens (Lexer) # 2. Parser Tokens → Árbol + Bytecode (ParserBase + Parser) # 3. Opt. Bytecode → Bytecode optimizado (Optimizer) # 4. Type Bytecode → Verificación de tipos (TypeChecker) # 5. VM Bytecode → Ejecución (VM con 83 opcodes) # 6. Backends Bytecode → WASM / Nativo (wasm_compiler / compiler)
1. Lexer (Lexer)
El lexer (alvz/core/lexer.py, 262 líneas) tokeniza el código fuente usando expresiones regulares en un solo paso. Reconoce 30+ tipos de tokens incluyendo palabras clave en español (funcion, clase, mientras, importar, etc.), identificadores, números, strings, operadores y símbolos. Soporta strings con escape de comillas y comentarios de línea con #.
2. Parser (ParserBase + Parser)
El parser (parser_base.py + parser.py, ~2100 líneas) es un compilador de una sola pasada que genera bytecode directamente sin AST intermedio. Características clave:
- Forward references: Pre-scan de funciones para permitir llamadas antes de la definición.
- Clases y herencia: Compila
clase Hijo de Padrecon cadena de prototipos. - Async/await: Compila
funcion asyncyaguardara opcodes especializados. - Funciones anónimas: Lambdas como expresiones con naming interno
__anon_N. - Acceso encadenado:
a.b.c()se compila como llamadas anidadas. - global keyword: Declaración de variables globales dentro de funciones.
3. Bytecode (83 opcodes)
El bytecode Alvz (alvz/core/bytecode.py) es una representación intermedia basada en pila con 83 opcodes. Cada instrucción es un byte (0-81) seguido de 0-2 bytes de operandos. Categorías:
| Categoría | Opcodes | Rango |
|---|---|---|
| Aritmética | OP_SUMA, OP_RESTA, OP_MUL, OP_DIV, OP_NEG | 0-4, 22 |
| Comparación | OP_EQ, OP_NEQ, OP_LT, OP_GT, OP_LTE, OP_GTE | 5-10 |
| Lógica | OP_AND, OP_OR, OP_NOT | 11-13 |
| Variables | OP_LOAD, OP_STORE, OP_LOAD_GLOBAL, OP_STORE_GLOBAL | 14-17 |
| Control | OP_JUMP, OP_JUMP_IF_FALSE, OP_CALL, OP_RETURN, OP_HALT | 18-21, 23, 25 |
| Constantes | OP_CONSTANT, OP_NULL | 24, 26 |
| Listas/Dicts | OP_NEW_LIST, OP_ADD_ITEM, OP_INDEX, OP_INDEX_ASSIGN, OP_LIST_LEN, OP_NEW_DICT, OP_DICT_KEYS | 27-32, 82 |
| POO | OP_NEW_OBJECT, OP_GET_ATTR, OP_SET_ATTR, OP_CALL_METHOD, OP_SUPER, OP_INSTANCEOF, OP_MAKE_FUNC | 33-40 |
| IO/Util | OP_PRINT, OP_READ, OP_RANDOM, OP_TIME, OP_TYPE, OP_SLICE, OP_ERROR_MSG | 41-47, 75 |
| Async | OP_ASYNC_CALL, OP_AWAIT | 76-77 |
| SQLite | OP_SQLITE_ABRIR, OP_SQLITE_EJECUTAR, OP_SQLITE_CONSULTAR, OP_SQLITE_CERRAR | 78-81 |
| HTTP | OP_SOLICITUD_HTTP (HTTP request) | 69 |
| Try/Catch | OP_TRY_SETUP, OP_TRY_POP, OP_THROW | 48-50 |
| Propiedades | OP_GETTER, OP_SETTER (getter/setter dispatch) | 51-52 |
| Llamada rápida | OP_FAST_CALL, OP_FAST_CALL2 | 53-54 |
| Diccionario | OP_DICT_MERGE, OP_DICT_CONTAINS | 55-56 |
| Strings | OP_STR_ADD, OP_STR_MUL, OP_STR_LEN, OP_STR_CONTAINS, OP_MAYUSCULAS, OP_MINUSCULAS | 57-62 |
| Iteración | OP_ITER, OP_NEXT, OP_FOR_LOOP | 63-65 |
| Lambda | OP_MAKE_FUNC = 70 (descriptor de función) | 70 |
4. Máquina Virtual (VM)
El VM (alvz/core/vm.py, ~1127 líneas) es un intérprete de bytecode basado en pila implementado en Python puro. Características:
- Pila de valores: Enteros como flotantes (precisión de 64 bits), strings, listas, diccionarios, objetos, null.
- Pila de llamadas: Soporta recursión y llamadas anidadas.
- POO completa: Clases, herencia, getters/setters, métodos estáticos,
super,instanceof. - Async/event loop:
ThreadPoolExecutorpara concurrencia real con futuros. - SQLite: Opcodes directos para operaciones de base de datos.
- HTTP: Peticiones web vía opcode dedicado.
- Stack traces: Muestra la línea de código fuente ofensiva con el contexto de llamadas.
5. Optimizador de Bytecode
El optimizador (alvz/core/optimizer.py, ~230 líneas) mejora el bytecode antes de ejecución:
- Plegado de constantes:
2 + 3→5en compilación. - Eliminación de código muerto: Instrucciones después de
OP_HALT. - Reasignación de saltos: Actualiza offsets tras optimizaciones.
Se activa con --optimize / -O.
6. Type Checker (Tipado Estático)
El verificador de tipos (alvz/core/type_checker.py, ~457 líneas) analiza el bytecode post-compilación:
- Verifica anotaciones de tipo en variables, parámetros y retorno.
- Inferencia automática desde literales (
5→numero). - Validación en llamadas a funciones con tipos anotados.
- Se activa con
--check-types/-T; activado por defecto.
7. Backend WASM
El compilador WASM (wasm_compiler.py + wasm_encoder.py, ~2300 líneas) traduce bytecode Alvz a módulos WebAssembly binarios:
- Arquitectura: VM de bytecode dentro del módulo WASM. Pila de valores en memoria lineal (tag i32 + data f64 = 16 bytes/entry).
- Memoria compartida: El módulo importa memoria del host (
add_import_memory) en vez de crearla propia, compartiendo el espacio de direcciones con host functions. - 40+ opcodes nativos implementados en WASM + 42 host calls para operaciones complejas (print, string ops, list/dict, SQLite, HTTP, random, etc.).
- Compatibilidad: wasmtime 45 con
access_caller=False, sinmemory64. - Uso directo:
alvz --wasm programa.alvzcompila y ejecuta al instante. - Build:
alvz build --wasm programa.alvz→wasmtime programa.wasm. - Datos: Bytecode y constantes como data segments en memoria WASM.
8. Backend Nativo (PyInstaller / Nuitka)
El compilador nativo (alvz/core/compiler.py, ~227 líneas) genera ejecutables standalone:
- PyInstaller: Empaqueta bytecode + VM Python en un solo .exe. Rápido y confiable.
- Nuitka: Compila Python → C++ → binario nativo. Mayor rendimiento pero más lento.
- Flags:
alvz build(PyInstaller),alvz build --nuitka(Nuitka),alvz build --wasm(WASM).
9. LSP (Language Server Protocol)
El servidor LSP (alvz/lsp/, ~880 líneas) se comunica vía JSON-RPC sobre stdin/stdout:
- Diagnóstico real: Ejecuta el parser completo para errores de sintaxis y semántica.
- Autocompletado: Keywords, StdLib, funciones, variables, snippets.
- Ir a definición: Navega a la definición de símbolos.
- Hover info: Muestra tipo y documentación.
- Símbolos del documento: Lista estructurada de funciones/clases/variables.
10. DAP (Debug Adapter Protocol)
El depurador DAP (alvz/lsp/dap.py) permite depuración interactiva:
- Breakpoints en líneas específicas.
- Step over/into/out para ejecución paso a paso.
- Inspección de variables locales y globales.
- Stack trace con cadena de llamadas completa.
- Evaluación de expresiones en contexto.
Se ejecuta con alvz-dap o alvz debug.
11. StdLib (Librería Estándar)
13 módulos en alvz/stdlib/ escritos en Alvz puro:
| Módulo | Descripción |
|---|---|
matematicas | Factorial, máximo, mínimo, promedio, par/impar |
cadenas | Reversa, capitalizar, contiene, recortar |
colecciones | Vacío, primero, último, sin_duplicados, invertir |
http | GET, POST, PUT, DELETE con parseo JSON |
fecha | Ahora, hoy, timestamp, formatear fecha |
testing | Describir, probar, afirmar_igual, resumen |
sistema | Archivos, JSON, rutas, copiar |
sqlite | Base de datos SQLite embebida |
aleatorio | Números aleatorios, escoger, mezclar, cadena |
csv | Lectura/escritura de CSV |
json | Codificar, decodificar, leer/escribir archivos |
expresiones_regulares | Coincidir, extraer, contar con regex |
consola | Menús, colores, confirmaciones, progreso |
12. Package Manager
30 paquetes disponibles en github.com/interpago/alvz-packages. El registro se obtiene de index.json vía GitHub raw. Los paquetes se instalan en ~/.alvz/packages/ y se importan con importar "nombre". Soporta dependencias entre paquetes.
Comandos: alvz install, alvz uninstall, alvz search, alvz list-packages, alvz info.
Estadísticas del Proyecto
| Métrica | Valor |
|---|---|
| Tests | 626 (0 fallos, 0 errores) |
| Opcodes VM | 83 |
| Opcodes WASM nativos | 40+ |
| Host calls WASM | 42 |
| Módulos StdLib | 13 |
| Paquetes en registro | 30 |
| Líneas de código Python | ~12,000 |
| Líneas de código Alvz (StdLib) | ~1,200 |
| VS Code Extension | v1.6.0 |
Herramientas CLI
Alvz incluye herramientas de línea de comandos para testear, formatear y generar proyectos.
Test Runner
Ejecuta pruebas unitarias automáticamente. Descubre archivos test_*.alvz o *_test.alvz.
$ alvz test tests/ # Ejecuta todos los tests en la carpeta $ alvz test test_mi_app.alvz # Ejecuta un archivo específico
importar "testing" funcion suma(a, b) { retornar a + b } describir("Pruebas de suma") probar("suma funciona", funcion_suma_test) funcion funcion_suma_test() { afirmar_igual(5, suma(2, 3), "2 + 3 = 5") } resumen()
Formateador
Formatea automáticamente tu código Alvz con indentación correcta de llaves.
$ alvz fmt app.alvz # Formatea el archivo $ alvz fmt --check app.alvz # Solo verifica (no modifica)
Scaffolding
Genera proyectos completos con estructura lista para usar.
$ alvz nuevo proyecto mi_app # Proyecto completo $ alvz nuevo api mi_api # API REST con FastAPI $ alvz nuevo cli mi_cli # Aplicación CLI $ alvz nuevo lib mi_lib # Librería reutilizable $ alvz nuevo test mis_pruebas # Archivo de test
Servidor de Lenguaje (LSP)
Alvz incluye un servidor LSP (Language Server Protocol) que proporciona asistencia inteligente en tu editor.
Características
- Autocompletado: Sugiere palabras clave, funciones incorporadas y nombres de variables.
- Diagnóstico en vivo: Detecta errores de sintaxis (paréntesis/llaves desbalanceados, caracteres inesperados).
- Ir a definición: Navega a la definición de funciones, variables y clases.
- Información al hover: Muestra el tipo y documentación de símbolos al pasar el ratón.
- Símbolos del documento: Lista estructurada de funciones, variables, clases y propiedades.
Uso
Ejecuta el servidor LSP desde la terminal:
$ alvz-lsp
Luego configura tu editor para conectarse al servidor. El LSP se comunica vía JSON-RPC sobre stdin/stdout.
Depurador (DAP)
Alvz implementa el Debug Adapter Protocol (DAP) para depuración interactiva desde tu editor.
Características
- Breakpoints: Pausa la ejecución en líneas específicas.
- Paso a paso: Step over, step into, step out.
- Inspección de variables: Examina variables locales y globales.
- Stack trace: Muestra la cadena de llamadas actual.
- Evaluación: Evalúa expresiones en contexto de depuración.
Uso
$ alvz-dap
El depurador se comunica vía JSON-RPC sobre stdin/stdout. Compatible con editores que soporten DAP (VS Code, etc.).
Consola Interactiva (REPL)
Prueba código al instante sin crear archivos. Solo escribe alvz en tu terminal.
alvz> variable a = 5 alvz> variable b = 5 alvz> imprimir(a + b) 10
Gestión de Errores Amigable
Alvz está diseñado para ayudarte a programar. Si cometes un error tipográfico o intentas acceder a algo que no existe, el lenguaje te dará sugerencias inteligentes.
$ alvz script.alvz
Error: La función 'imprimr' no existe. ¿Quisiste decir 'imprimir'?
Manejo de Excepciones (intentar / capturar)
Puedes capturar errores para evitar que tu programa se detenga inesperadamente.
intentar { variable resultado = 10 / 0 } capturar { imprimir("¡Ocurrió un error: " + error_msj() + "!") }
Tipos de Errores Soportados
- Errores Léxicos: Caracteres no reconocidos.
- Errores de Sintaxis: Estructuras incompletas o mal formadas (incluye sugerencias de palabras clave).
- Errores de Referencia: Variables o funciones no definidas (incluye sugerencias de nombres cercanos).
- Errores en Tiempo de Ejecución: Errores durante la ejecución (como división por cero o índice fuera de rango) con stack trace completo que muestra la línea exacta y la cadena de llamadas.