Sintaxis en español
si, sino, mientras, retornar. Sin traducciones mentales ni palabras reservadas en inglés.
v0.1.0 · 109 pruebas · MIT
Vaca es un lenguaje de servidores con un motor en Rust, sin frameworks y con TLS auditado. Llaves, punto y coma opcional, análisis de variables no usadas y concurrencia real. Para una API, un pipeline de datos o un laboratorio de estrés.
Tus programas no necesitan Node ni npm: un binario y tus archivos.vaca.
importar http
importar json
importar concurrencia
peticiones = concurrencia.contador(0)
fn manejador(peticion) {
total = peticiones.incrementar()
si peticion.ruta == "/salud" {
retornar {"cuerpo": {
"estado": "ok",
"peticiones": total
}}
}
si peticion.metodo == "POST" y peticion.ruta == "/eco" {
datos = json.convertir(peticion.cuerpo)
retornar {"estado": 201,
"cuerpo": {"recibido": datos}}
}
retornar {"estado": 404,
"cuerpo": {"error": "no encontrada"}}
}
http.servidor(8080, manejador, 1000)Sin frameworks. Sin runtime externo. Sin ceremonia.
El lenguaje
Lo que esperas de un lenguaje serio, con la sintaxis que ya piensas. Todo esto viene en la biblioteca estándar: no hay paquetes que instalar ni ecosistema que mantener.
si, sino, mientras, retornar. Sin traducciones mentales ni palabras reservadas en inglés.
La estructura se ve a simple vista. El punto y coma existe, pero nunca es obligatorio.
El análisis semántico corre antes de ejecutar. Si declaras una variable y no la usas, el programa no arranca.
Escribe contador: Entero = 0 cuando quieras documentar. El tipado sigue siendo flexible.
Valores por defecto, callbacks, closures y recursividad. Las funciones se pasan y se devuelven.
Clases, herencia, este e iniciar. Métodos y propiedades con la misma sintaxis de siempre.
Listas y diccionarios con agregar, filtrar, mapear, ordenar, get, set y mucho más.
lanzar, intentar, atrapar y afirmar. Sin excepciones silenciosas ni retornos mágicos.
JSON, SQLite, matemáticas, archivos, texto, tiempo, sistema y DataFrames en la biblioteca estándar.
Cliente y servidor HTTP/1.1. Cada conexión en su hilo, con límite de conexiones configurable.
Lee CSV, filtra, ordena, agrupa y exporta. DataFrames ligeros que caben en la stdlib.
async y esperar sobre hilos del sistema. Contadores atómicos, paralelo y esperar_todas.
Sin frameworks. Sin node_modules. Rust estándar yrustls para TLS.
En práctica
Sin signos de más ni ceremonias. Cuatro programas reales que puedes ejecutar hoy con vaca archivo.vaca.
# Variables, tipos e interpolación
nombre: Texto = "Mundo"
contador = 0
para i = 1 hasta 3 {
contador = contador + i
}
imprimir(a"Hola, {nombre}. Suma: {contador}")
# Listas y diccionarios con métodos
frutas = ["pera", "uva", "higo"]
frutas.agregar("melón")
frutas.ordenar()
imprimir(frutas)importar http
importar json
importar concurrencia
peticiones = concurrencia.contador(0)
fn manejador(peticion) {
total = peticiones.incrementar()
si peticion.metodo == "GET" y peticion.ruta == "/salud" {
retornar {"cuerpo": {
"estado": "ok",
"peticiones": total
}}
}
si peticion.metodo == "POST" y peticion.ruta == "/eco" {
datos = json.convertir(peticion.cuerpo)
retornar {"estado": 201,
"cuerpo": {"recibido": datos}}
}
retornar {"estado": 404,
"cuerpo": {"error": "no encontrada"}}
}
http.servidor(8080, manejador, 1000)importar datos
importar json
df = datos.leer_csv("ventas.csv")
datos.ver(df)
grandes = datos.filtrar(df, "monto", ">=", 100)
ordenado = datos.ordenar(grandes, "monto", falso)
resumen = datos.agrupar_resumir(ordenado, "ciudad", "monto", "suma")
imprimir(json.serializar(resumen))
datos.guardar_csv(resumen, "resumen.csv")clase Figura {
fn area() {
lanzar "cada figura debe implementar area"
}
}
clase Circulo(Figura) {
fn iniciar(radio) {
este.radio = radio
}
fn area() {
retornar 3.1416 * este.radio * este.radio
}
}
clase Rectangulo(Figura) {
fn iniciar(ancho, alto) {
este.ancho = ancho
este.alto = alto
}
fn area() {
retornar este.ancho * este.alto
}
}
figuras = [nuevo Circulo(2), nuevo Rectangulo(3, 4)]
para figura en figuras {
imprimir(a"Área: {figura.area()}")
}Sin marketing
Esto es lo que cualquier lenguaje serio debería tener. Vaca no lo tiene todo: aquí está el estado real, sin letra pequeña.
El detalle, fase por fase, está en el estado del proyecto.
Bajo el capó
Cada async fn arranca un hilo. Cada conexión HTTP, también. Los contadores atómicos no pierden incrementos y las tareas se pueden esperar varias veces sin repetir trabajo.
importar tiempo
async fn consultar(nombre, ms) {
tiempo.dormir(ms)
retornar a"{nombre} lista"
}
inicio = tiempo.millis()
a = consultar("A", 200)
b = consultar("B", 200)
resultado_a = esperar a
resultado_b = esperar b
imprimir(tiempo.millis() - inicio) # ~200, no 400Es un modelo de hilos, no un event loop.Para cargas masivas, limita las conexiones conhttp.servidor(..., limite) o reparte el tráfico entre varias instancias. Cada conexión reserva 8 MiB de pila virtual.
Instalación
Sin instaladores exóticos ni un runtime que aprender. Rust estable,cargo build --release y un binario que puedes copiar a cualquier servidor.
Motor en Rust estándar. TLS usa rustls y se descarga al compilar.
git clone https://github.com/ulf-frostypaw/vaca.git
cd vaca
cargo build --releaseLos ejemplos cubren el lenguaje, la stdlib, los datos y los servidores.
./target/release/vaca ejemplos/hola.vacaUn servidor concurrente listo para probar con carga real.
./target/release/vaca ejemplos/servidor_concurrente.vacaHerramientas
Un solo binario con REPL, inspector de tokens, volcado de AST y soporte de editor. Lo justo para trabajar sin montar un ecosistema entero.
| Comando | Qué hace |
|---|---|
vaca archivo.vaca | Ejecuta un programa |
vaca run archivo.vaca | Alias explícito de ejecución |
vaca repl | Consola interactiva multilínea |
vaca tokens archivo.vaca | Muestra el flujo de tokens |
vaca ast archivo.vaca | Muestra el árbol de sintaxis |
vaca --version | Versión del intérprete |
$ vaca repl
vaca> fn doble(n) { retornar n * 2 }
vaca> doble(21)
42
vaca> frutas = ["pera", "uva"]
vaca> frutas.agregar("higo")
vaca> frutas
["pera", "uva", "higo"]Transparencia
Vaca se construyó por fases. Estas son las que están cerradas, las que están a medias y la que todavía falta. Sin promesas que el código no cumpla.
| Fase | Contenido | Estado |
|---|---|---|
| 00 | Andamiaje y tipos base | Completa |
| 01 | Lexer en español | Completa |
| 02 | Parser y AST con llaves | Completa |
| 03 | Intérprete de árbol | Completa |
| 04 | Compilador a bytecode y VM | Parcial |
| 05 | Funciones, cierres, defaults y recursividad | Completa |
| 06 | Listas, diccionarios y métodos nativos | Completa |
| 07 | POO: clases, herencia, este e iniciar | Completa |
| 08 | Módulos JSON, HTTP, mate, tiempo y sistema | Completa |
| 09 | DataFrames y CSV | Completa |
| 10 | async, esperar y concurrencia real | Completa |
| 11 | CLI, REPL, editor y empaquetado | Parcial |
| 12 | Type checker, optimizaciones y GC | Parcial |
Siguiente objetivo
Un pool de hilos acotado o un event loop para reducir el coste por tarea y soportar decenas de miles de conexiones sin 8 MiB por hilo.