Saltar al contenido
Vacav0.1.0GitHub

Ejemplos de uso

Programas completos y ejecutables. Todos usan la sintaxis real de Vaca y muestran la salida esperada. Guarda cualquiera en un archivo .vaca y ejecútalo con vaca archivo.vaca.

Hola, mundo

nombre = "Mundo"
imprimir(a"Hola, {nombre}!")
Hola, Mundo!

FizzBuzz

para i = 1 hasta 15 {
    si i % 15 == 0 {
        imprimir("FizzBuzz")
    } sino si i % 3 == 0 {
        imprimir("Fizz")
    } sino si i % 5 == 0 {
        imprimir("Buzz")
    } sino {
        imprimir(i)
    }
}
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

Factorial y Fibonacci

fn factorial(n) {
    si n <= 1 {
        retornar 1
    }
    retornar n * factorial(n - 1)
}

fn fib(n) {
    si n < 2 {
        retornar n
    }
    retornar fib(n - 1) + fib(n - 2)
}

imprimir(factorial(6))   # 720
imprimir(fib(10))        # 55

Two Sum con diccionario

fn dos_suma(numeros, objetivo) {
    vistos = {}

    para i = 0 hasta numeros.longitud() - 1 {
        faltante = objetivo - numeros[i]
        si vistos.existe(faltante) {
            retornar [vistos.obtener(faltante), i]
        }
        vistos.set(a"{numeros[i]}", i)
    }

    retornar nulo
}

imprimir(dos_suma([2, 7, 11, 15], 9))
[0, 1]

Búsqueda binaria

fn busqueda_binaria(lista, objetivo) {
    izquierda = 0
    derecha = lista.longitud() - 1

    mientras izquierda <= derecha {
        medio = (izquierda + derecha) / 2
        valor = lista[medio]

        si valor == objetivo {
            retornar medio
        }

        si valor < objetivo {
            izquierda = medio + 1
        } sino {
            derecha = medio - 1
        }
    }

    retornar -1
}

imprimir(busqueda_binaria([1, 3, 5, 7, 9], 7))
3

Pila con una lista

pila = []
pila.agregar(1)
pila.agregar(2)
pila.agregar(3)

imprimir(pila.pop())   # 3
imprimir(pila.pop())   # 2
imprimir(pila)         # [1]

Contar palabras

texto = "vaca habla español vaca rust español"
conteo = {}

para palabra en texto.dividir(" ") {
    conteo.incrementar(palabra)
}

imprimir(conteo)
{"español": 2, "habla": 1, "rust": 1, "vaca": 2}

POO con herencia

clase Empleado {
    fn iniciar(nombre, salario) {
        este.nombre = nombre
        este.salario = salario
    }

    fn resumen() {
        retornar a"{este.nombre}: {este.salario}"
    }
}

clase Gerente(Empleado) {
    fn iniciar(nombre, salario, equipo) {
        este.nombre = nombre
        este.salario = salario
        este.equipo = equipo
    }

    fn resumen() {
        retornar a"{este.nombre} dirige {este.equipo} personas"
    }
}

gerente = nuevo Gerente("Ada", 5000, 8)
imprimir(gerente.resumen())
Ada dirige 8 personas

Excepciones

fn dividir(a, b) {
    si b == 0 {
        lanzar "división entre cero"
    }
    retornar a / b
}

intentar {
    imprimir(dividir(10, 0))
} atrapar error {
    imprimir(a"Error: {error}")
}

imprimir("sigo vivo")
Error: división entre cero
sigo vivo

JSON y archivos

importar json
importar archivo

usuario = {
    "nombre": "Ada",
    "activo": verdadero,
    "roles": ["admin", "dev"]
}

texto = json.serializar(usuario, verdadero)
archivo.escribir("usuario.json", texto)

leido = json.convertir(archivo.leer("usuario.json"))
imprimir(leido.nombre)      # Ada
imprimir(leido.roles[1])    # dev

DataFrames con CSV

Con ventas.csv:

ciudad,monto
Madrid,100
Lima,50
Madrid,30
importar datos

df = datos.leer_csv("ventas.csv")
imprimir(datos.dimensiones(df))

resumen = datos.agrupar_resumir(df, "ciudad", "monto", "suma")
imprimir(datos.columna(resumen, "ciudad"))
imprimir(datos.columna(resumen, "monto"))

datos.guardar_csv(resumen, "resumen.csv")
[3, 2]
["Lima", "Madrid"]
[50, 130]

Contador atómico entre hilos

importar concurrencia

contador = concurrencia.contador(0)

fn trabajar() {
    para _ = 1 hasta 1000 {
        contador.incrementar()
    }
    retornar nulo
}

tareas = []
para _ = 1 hasta 4 {
    tareas.agregar(concurrencia.tarea(trabajar))
}

concurrencia.esperar_todas(tareas)
imprimir(contador.valor())
4000

Servidor HTTP

importar http
importar json

fn manejador(peticion) {
    si peticion.metodo == "GET" y peticion.ruta == "/salud" {
        retornar {"cuerpo": {"estado": "ok"}}
    }

    si peticion.metodo == "POST" y peticion.ruta == "/eco" {
        retornar {"estado": 201, "cuerpo": json.convertir(peticion.cuerpo)}
    }

    retornar {"estado": 404, "cuerpo": {"error": "no encontrada"}}
}

http.servidor(8080, manejador)
curl http://localhost:8080/salud
curl -X POST -d '{"hola":"mundo"}' http://localhost:8080/eco
{"estado":"ok"}
{"hola":"mundo"}

Patrón Strategy

clase PagoStripe {
    fn iniciar(api_key) {
        este.api_key = api_key
    }

    fn pagar(monto) {
        retornar a"Stripe cobró {monto}"
    }
}

clase PagoPaypal {
    fn iniciar(email) {
        este.email = email
    }

    fn pagar(monto) {
        retornar a"PayPal cobró {monto} a {este.email}"
    }
}

clase Procesador {
    fn iniciar(estrategia) {
        este.estrategia = estrategia
    }

    fn cobrar(monto) {
        retornar este.estrategia.pagar(monto)
    }
}

stripe = nuevo Procesador(nuevo PagoStripe("sk_test"))
paypal = nuevo Procesador(nuevo PagoPaypal("ada@ejemplo.com"))

imprimir(stripe.cobrar(100))
imprimir(paypal.cobrar(50))
Stripe cobró 100
PayPal cobró 50 a ada@ejemplo.com

Rate limiter por minuto

importar tiempo

peticiones = {}
limite = 5

fn permitir(ip) {
    minuto = entero(tiempo.ahora() / 60)
    clave = a"{ip}:{minuto}"
    cuenta = peticiones.incrementar(clave)
    retornar cuenta <= limite
}

para _ = 1 hasta 6 {
    imprimir(permitir("127.0.0.1"))
}
verdadero
verdadero
verdadero
verdadero
verdadero
falso

El diccionario crece con cada IP y minuto. En un servidor de larga duración, elimina las claves antiguas periódicamente.

Más ejemplos en el repositorio

El directorio ejemplos/ incluye programas más largos:

Archivo Tema
algoritmos.vaca Two Sum, búsqueda binaria, Fibonacci, paréntesis y merge sort
grafos.vaca BFS, DFS, caminos y orden topológico
colecciones.vaca mapear, filtrar, reducir, orden y búsqueda
closures.vaca Cierres, callbacks y memoización
poo.vaca / poo_avanzada.vaca Herencia, contratos, observer y strategy
patrones.vaca Singleton, middleware, cola FIFO, caché y rate limiter
datos.vaca DataFrames con ventas.csv
config.vaca + .env Configuración con sistema.cargar_env y comentarios al final
async.vaca y concurrencia.vaca Tareas, hilos y contadores
servidor.vaca / servidor_api.vaca Servidores HTTP
servidor_concurrente.vaca Servidor de estrés con métricas