Recetario
Recetario
Patrones copy-paste. Cada uno es completo y está doctested en su página — empezá acá, después seguí el link.
Validar entrada, conservar resultados parciales — y actualizar cada fila§
Validá un payload a un valor tipado; sumá los válidos y saltá los malos con try/recover. Después cambiá cada fila de una tabla: las listas y los maps son valores, así que each r in rows + set r[…] solo cambiaría la copia del loop. Armá las filas nuevas con apply + merge, devolvelas con give, y hacé set rows to … en el llamador:
-- Doc cookbook: validate a payload into a typed value, and sum valid ones with
-- partial results (try/recover skips the bad ones); then update every row of a
-- table the value-semantics way. Copy-paste-ready patterns.
intent: "doc cookbook: validate + partial results + update rows"
type Order
id: number
total: number
task validate_order(payload)
when "total" not in payload
raise("missing total")
when payload["total"] < 0
raise("total must be >= 0")
give Order(payload["id"], payload["total"])
task bad_order()
give validate_order({"id": 2, "total": -5})
task safe_total(payloads)
let total be 0
each p in payloads
try
let o be validate_order(p)
set total to total + (total of o)
recover err
log "skipped: " + err -- partial results: skip the invalid ones
give total
-- Lists and maps are values: `each r in rows` + `set r[...]` would change a copy.
-- Build the new rows and give them back.
task with_discount(rows, pct)
give apply((r) => merge(r, {"total": r["total"] * (100 - pct) // 100}), rows)
print("safe_total of mixed orders → " + text(safe_total([{"id": 1, "total": 10}, {"id": 2, "total": -1}, {"id": 3, "total": 5}])))
test "validate accepts good input and rejects bad"
assert_eq(total of validate_order({"id": 1, "total": 100}), 100)
assert_error(bad_order)
assert_error(() => validate_order({"id": 3}))
test "partial results: invalid orders are skipped"
assert_eq(safe_total([{"id": 1, "total": 10}, {"id": 2, "total": -1}, {"id": 3, "total": 5}]), 15)
test "update every row: build new rows, the original stays as it was"
let rows be [{"id": 1, "total": 200}, {"id": 2, "total": 50}]
let cheaper be with_discount(rows, 10)
assert_eq(cheaper, [{"id": 1, "total": 180}, {"id": 2, "total": 45}])
assert_eq(rows[0]["total"], 200)
set rows to with_discount(rows, 10)
assert_eq(rows, cheaper)Los otros patrones (cada uno mostrado completo en su página)§
- Una página con estilo desde layout + componentes —
{ layout }, slots nombrados,{ include … with {props} }, CSS inline en un bloque{ raw }→ Construí un sitio web. - Un formulario clásico (sin JS) —
<form method="post">+form of request(urlencoded/multipart, archivos como bytes exactos) → Construí un sitio web. - Páginas 404/500 propias con status honestos —
errors with <task>; HTML para navegadores, JSON para agentes,redirectpara un 401 → Servidor HTTP. - Datos seguros en un
<script>inline —{ raw json_for_script(x) }(jamásjson_encodeahí) → Frontend. - Rutas partidas en módulos —
export routes+mount alias.grupo at "/prefix"→ Módulos. - API HTTP con auth + validación —
auth with,expect body {…}, los response helpers → Servidor HTTP. - CRUD sobre SQL —
db_open/sql_exec/sql(SQLite in-memory en el doctest) → SQL, Mongo y Redis. - Una operación LLM —
generate "…" given X, ramificar conllm_available()→ Primitivas LLM. - Un agente con tools — el loop allow-list
llm_step+call_tool→ Tool calling. - Un secret en cualquier header —
{"x-api-key": secret("KEY")}/bearer(...), materializado solo en el socket → Secretos. - Leer/escribir un archivo con capacidades —
require file(...)+read_file/write_file→ Archivos e I/O. - El loop on-chain — leer (nonce/fees/UTXOs) → construir →
confirmcon los números → firmar (la única puerta gateada) → enviar → espera acotada; EVM (incl. los L2 Base/Arbitrum/Optimism) → Blockchain, Bitcoin (cada satoshi contabilizado) → Bitcoin. - Custodia fría con PSBT — el agente prepara y audita, un humano firma en su hardware wallet, el agente finaliza y difunde (la clave jamás toca la máquina del agente) → Bitcoin.
- Una transferencia detrás de una puerta humana —
confirm "… fee X?" within 15mANTES desecp256k1_sign, compuesto bajoservecon monitoreo cron y unchart()negociado → Blockchain (la ruta flagship). - Miles de feeds en vivo en un thread — el event-loop
while+ws_select, reconexión + keepalive opt-in, fan-out conparallel_map→ WebSocket.
Cada snippet de esas páginas está doctested contra esta versión, así que un LLM puede copiar uno y funciona.