Por ejemplo
Nyx por ejemplo
Recetas resueltas, en orden de dificultad. Cada una es un programa que compila y corre con la versión del pie: leerla, copiarla, cambiarla.
Fundamentos
- 01Hello WorldEl programa Nyx más simple — imprimir texto en la terminal.
- 02Variables
letinmutable,varmutable, tipos básicos e interpolación de strings. - 03FunctionsDefinir funciones con parámetros, tipos de retorno y argumentos por defecto.
- 04Control Flowif/else, bucles while, for-range, for-in, break y continue.
- 05ArraysCrear, indexar, agregar elementos e iterar sobre arrays dinámicos.
- 06MapsAlmacenamiento clave-valor con
Map.new(), insert, get, has e iteración de claves. - 07Stringstrim, length, substring, toUpper, split, contains e interpolación.
- 08StructsDefinir tipos de datos con campos y agregar métodos vía
impl. - 09EnumsTipos de datos algebraicos con variantes que portan datos y
matchexhaustivo. - 10ClosuresFunciones de primera clase que capturan su entorno circundante.
- 107continue en forSaltar al siguiente elemento dentro de un for — sobre un array y sobre un rango.
Entrada, salida y datos
- 11Lectura y Escritura de ArchivosLeer y escribir archivos con
read_fileywrite_file. - 12Entrada por StdinLeer entrada del usuario desde la terminal con
read_line. - 13Argumentos de CLIAcceder a los argumentos de línea de comandos con
get_args. - 14Variables de EntornoLeer variables de entorno con
getenvygetenv_default. - 15Parseo de JSONParsear strings JSON hacia Maps y Arrays.
- 16Serialización JSONConvertir estructuras de datos de vuelta a strings JSON.
- 17Expresiones RegularesMatch, extracción y reemplazo con regex POSIX.
- 18Parseo de CSVDividir líneas y campos para procesar datos tabulares.
- 19Fecha y HoraTimestamps, fechas formateadas y medición de tiempo.
- 20Spawn y ChannelCrear threads y comunicarse mediante channels.
- 101Errores de archivo: dos niveles
Resultcuando quien llama puede reaccionar, panic cuando morir es lo honesto. - 106JSON: números exactosjson_stringify reemite cada número tal como vino; json_as_float pasa por un double y pierde los ceros de más.
- 116Códigos de barras y QRstd/barcode devuelve datos, no dibujos — QR, Code 128 y EAN-13 en Nyx puro, el mismo programa nativo y en wasm.
- 118Factura en PDFuna factura tamaño carta en Nyx puro — montos alineados a la derecha, una tabla hecha con text+line, un logo PNG y un QR, nativo y en wasm.
- 123Armar y leer un archivo .zipstd/zip en Nyx puro, sin zlib: DEFLATE por entrada, CRC-32 verificado al leer, topes contra bombas zip.
- 124Un libro contable en .xlsxstd/xlsx escribe un libro de verdad en Nyx puro: celdas con tipo, celdas combinadas, encabezado fijo, autofiltro y separador de miles.
- 125Leer una hoja .xlsxxlsx_read devuelve cada celda con su tipo, fechas ISO, los huecos como celdas vacías y topes por omisión contra bombas zip.
- 133Miniaturas de la foto de un productostd/image decodifica con la mayor reducción posible, saca varios tamaños de una decodificación y aplana la transparencia sobre blanco.
- 138Una plantilla .xlsx de carga masiva con listas desplegablesvalidate_list y validate_list_range restringen una columna a valores permitidos; xlsx_fill marca las filas rechazadas.
- 139Un PDF que calca una hoja preimpresastd/pdf fase 2: grosor de línea, sombreado gris y en color, Times y Courier, texto girado, estado gráfico por página.
- 140Miniaturas de hojas escaneadasstd/image sobre escaneos tamaño carta: casi no hay reducción, así que importa el modo de compilación.
- 143Dibujar una página de un PDF como imagenstd/pdf_render dibuja una página de un PDF en una
Imageen el servidor, sin programas externos; lo que no sabe dibujar es un error o una lista que se revisa. - 145Un CSV grande sin split() por fila
indexOfubica las comas ystring_to_float_rangeparsea el número directo de los bytes, sin crear un substring por campo. - 146Un CSV grande por columnas
try_csv_readparsea un CSV en una pasada directo a columnas tipadas; una columnacatllega como códigos enteros más un diccionario, así que agrupar es indexar un arreglo.
Tipos y patrones
- 21TraitsDefinir comportamiento compartido con
traiteimpl ... for. - 22Cotas de TraitRestringir genéricos con
<T: Display>. - 23Derive CloneGenerar automáticamente implementaciones de Clone, Debug y otros traits.
- 24Option: Some y NoneManejar valores opcionales con
SomeyNone. - 25Result: Ok y ErrManejo de errores con
OkyErr. - 26Operador TryPropagación de errores con cortocircuito usando
?. - 27if letDesestructurar enums en condiciones con
if let. - 28Guardas de MatchAgregar condiciones a los brazos de match con guardas
if. - 29Iterator: map y filterTransformaciones perezosas con
.iter().filter().map().collect(). - 30Iterator: foldReducir una secuencia a un único valor con
fold. - 105Campo Fn en un structLigar el campo a una variable antes de llamarlo — el receptor puede ser variable local, parámetro por valor o campo anidado.
- 135Sombrear un nombre dentro de un bloqueUn nombre redeclarado en un if, un ciclo, un brazo de match o un try es otra variable que desaparece al cerrar la llave.
- 136defer corre al cerrar su bloquedefer se dispara al salir del bloque donde está escrito — caída al final, return, ?, break o continue — en orden LIFO.
Avanzado
- 31Iterador: enumerate()Obtener pares índice-valor durante la iteración.
- 32Iterador: take() y skip()Recortar secuencias con
takeyskip. - 33RecursiónResolver problemas con funciones que se llaman a sí mismas.
- 34OrdenamientoOrdenar arrays de enteros y strings.
- 35Manejo de ErroresBloques try/catch para recuperarse de errores en tiempo de ejecución.
- 36Defer y CleanupLimpieza garantizada con bloques
defer { ... }. - 37Sleep y TemporizadoresPausar la ejecución y medir tiempo transcurrido.
- 38Hashing CriptográficoSHA-256, MD5 y HMAC-SHA256 para verificación de integridad.
- 39Números Aleatorios y UUIDGenerar números aleatorios e identificadores únicos.
- 40Creación de ThreadsEjecutar funciones de forma concurrente con
thread_spawn. - 102Motor de templates estilo FlaskInterpolación,
#if,#eachy partials constd/template. - 109await en el navegadorUna async fn que espera al anfitrión JS sin partir el flujo en callbacks — wasm32-wasi con Asyncify.
- 114IndexedDB sin conexiónUn catálogo y una cola de ventas que sobreviven a un F5 — await sobre IndexedDB, sin el límite de localStorage.
- 117Web Serial: ticket de impresora térmicabytes ESC/POS directo a una impresora de punto de venta desde wasm32-wasi con await — sin diálogo de impresión, con corte y gaveta.
- 121Guardar un valor entre eventos wasmarena_persist copia un String o Array fuera de la arena por evento para que otro evento lo lea intacto — el arreglo para la memoria reciclada en silencio.
- 128Verificar un aviso de pago firmadostd/rsa comprueba una firma RSA-SHA256 con la clave pública del proveedor: PKCS#1 v1.5 o PSS, verdadero, falso o error.
- 131Fórmulas de usuario seguras para una nóminastd/expr compila una vez, evalúa por empleado con decimales de punto fijo y dice la posición de cada error.
- 132Una PWA que habla con un servidor de la red localPermiso de red local más un plazo en fetch y SSE, para que una tablet no espere minutos a un servidor apagado.
Redes
- 41Base64Codificación/decodificación RFC 4648 — variantes estándar y URL-safe.
- 42URL EncodePercent-encoding, query strings y escape de entidades HTML.
- 43Configuración TOMLParsear strings de configuración con
std/toml. - 44MessagePackSerialización binaria: compacta, tipada, orientada a bytes.
- 45DNS ResolveConvertir nombres de host a direcciones IP con
resolve. - 46Cliente TCPConectar, escribir y leer sobre sockets TCP crudos.
- 47Servidor TCPEscuchar, aceptar y hacer eco con
tcp_listen. - 48Socket UDPDatagramas sin conexión con
udp_bindyudp_sendto. - 49HTTP GETPeticiones de cliente HTTP de alto nivel con
std/http. - 50HTTP POSTPeticiones POST y métodos personalizados con
http_request. - 51Servidor HTTPServidor mínimo con
http_servey enrutamiento de peticiones. - 52Middleware HTTPFramework web con
App, rutas, logging y CORS. - 53WebSocketFraming RFC 6455, parseo y respuestas de handshake.
- 55SQLiteBase de datos SQL en memoria con
sqlite_openysqlite_query. - 56Escritura CSVCrear y serializar documentos CSV con
std/csv. - 103Un modelo escrito una sola vez
#[derive(Fields)]ystd/postgres: el struct es la única fuente de verdad del esquema. - 104Sin driver de por medio
std/postgreshabla el protocolo wire v3 y SCRAM-SHA-256 en Nyx puro — conectar, versionar migraciones y parametrizar sin libpq. - 108HTTP: plazo y causaUn cliente que se rinde a tiempo y distingue POR QUÉ falló: tls, timeout, connection.
- 110Eventos del servidor (SSE)Un canal que no ocupa un worker: la ruta pasa por el pipeline entero y después difunde a un room.
- 113Correo saliente con std/smtpMensaje, adjunto y dot-stuffing armados en Nyx puro — STARTTLS en 587 o TLS desde el saludo en 465.
- 115Claves repetidas de formulario/queryform_values/query_values recuperan todos los valores de una clave repetida — casillas, <select multiple> — donde req.form se queda callado con la última.
- 119LISTEN/NOTIFY como bus en vivoPostgreSQL reparte una notificación a las salas SSE de todos los procesos, solo si hace commit — sin Redis en el medio.
- 120Conexiones keep-alive ociosasworkers es cuántos pedidos corren a la vez, no cuántas conexiones quedan abiertas — una pestaña ociosa se estaciona en el event loop y no cuesta un hilo.
- 122HTTPS a un sitio con la cadena mal armadaHttpOpts.cas_extra suma el certificado intermedio que falta para UNA petición, sin apagar la verificación.
- 126gzip automático en std/serveLas respuestas de texto de 1 KiB o más salen comprimidas cuando el cliente manda Accept-Encoding: gzip — sin escribir código.
- 127Topes de cuerpo y límite de peticiones en std/serveUn tope de cuerpo por ruta (413) y un limitador de peticiones por origen (429 con Retry-After), compartido por todos los workers.
- 129HTTPS con certificado de clienteTLS mutuo por petición: HttpOpts presenta tu certificado y clave, validados ANTES de conectar.
- 130Subir un archivo binario con multipartmultipart_build y try_http_post_multipart envían campos de texto más un archivo binario, y un servidor local comprueba que los bytes llegan intactos.
- 134Convertir el correo entrante en casosstd/imap, std/mime y un punto de avance por UID atan la respuesta del cliente al hilo de la cotización que contesta.
- 137OAuth2 para un buzón de Gmail o Microsoft 365std/oauth2 arma la URL de login con PKCE, renueva tokens y soporta device code — el token que esperan imap_auth_xoauth2 y smtp_auth_xoauth2.
- 141Un correo con versión de texto Y versión HTMLsmtp_message_alternative arma multipart/alternative, se combina con adjuntos y no inventa el texto por ti.
- 142Verificar SPF, DKIM y DMARC antes de enviar correostd/dns lee registros TXT y CNAME y distingue NXDOMAIN de NODATA; la lógica de comprobación es pura y se prueba sin red.
- 144Reenviar una respuesta por partes apenas llega
try_http_streamlee de a poco la respuesta de otra API ysse_broadcastreenvía cada evento al navegador en cuanto llega.
Concurrencia
- 57MutexProteger estado compartido entre threads con locks.
- 58Patrones de CanalesPaso de mensajes con channels con buffer y centinelas.
- 59Pool de WorkersDespachar tareas a N threads mediante channels compartidos.
- 60Productor-ConsumidorPipeline desacoplado con contrapresión de channel acotado.
- 61WaitGroupEsperar a múltiples threads con
wg_add/wg_done/wg_wait. - 62SemáforoLimitar el acceso concurrente con
sem_acquire/sem_release.
Sistemas
- 64Fork & ExecEjecutar comandos externos con
fork,execvpywaitpid. - 65PipesConectar procesos con
pipe_newydup2. - 66Manejo de SeñalesRegistrar callbacks de señales con
signal_handle. - 67Vigilante de ArchivosDetectar cambios en archivos mediante polling con
stat. - 68Control de ProcesosPID, directorio de trabajo, detección de terminal y stat de archivos.
- 69Terminal RawEntrada carácter por carácter con
raw_mode_enter. - 70Script ShebangEjecutar archivos Nyx como scripts ejecutables con
#!/usr/bin/env nyx. - 111nyx test --coverageQué función de src/ ninguna prueba llamó — homónimas de módulos distintos no se mezclan al medir.
- 112include_bytesUn recurso binario que viaja dentro del ejecutable, leído al compilar — sin depender de que el archivo llegue a disco.