requires — Validando Capacidades
En esta página
requires declara una dependencia obligatoria del módulo. El compilador consulta
la tabla de capacidades del objetivo activo y, si alguna cláusula falla, aborta
el build con un diagnóstico claro apuntando a la directiva — ningún código
se ejecuta sin las capacidades necesarias.
Las capacidades conocidas incluyen backend.{vm,native,wasm},
platform.{posix,linux,macos,windows}, feature.{fs,net,process,signals,threads, gpu,bigint} y version >= X.Y. Se pueden apilar varias cláusulas: todas
deben cumplirse.
La forma más simple exige que el módulo se ejecute únicamente en el backend VM, con acceso al sistema de archivos y en una versión mínima del lenguaje:
Tres requires en secuencia; el compilador los valida antes de cualquier fn.
// Feature: `enable` and `requires` directives
// Syntax: `enable <feature>;` / `requires <capability>;`
// When to use: gate a module on backend capabilities (FS, signals,
// threads, GPU, ...) or platform (POSIX vs Windows). Build fails
// early with a clear message instead of panicking at runtime.
//
// See `specs/enable-requires-directives.md` for the full specification.
requires backend.vm
requires feature.fs
requires version >= 0.1
// `enable` activates optional language features. Unknown features emit
// a warning (forward-compat); enabling a feature unsupported on the
// current backend is a hard error.
//
// enable simd // available only on backend.native / .wasm
// enable signals // available on backend.vm / .native
//
// Diretivas devem aparecer no topo do arquivo, antes de `use`, `fn`,
// `struct`, etc. Diretiva após declaração → E_DirectiveNotAtTop.
fn main() {
print("directives validated at build time; nothing to do in runtime")
}
// Run:
// zolo run 01-enable-requires.zolo
// → directives validated at build time; nothing to do in runtime
//
// Try changing `requires backend.vm` to `requires backend.native` —
// the build will now fail with E_CapabilityMissing pointing at the
// directive, before any of your code runs.
Cuando el módulo depende de varias features en conjunto — por ejemplo, fs y
process — cada una tiene su propia línea. Llegar a main ya significa que
todas están disponibles, sin necesidad de fallbacks en tiempo de ejecución:
requires feature.fs + requires feature.process garantizan ambas antes de la ejecución.
// parity-sub: pid:\s*\d+ => pid: <N>
// Feature: gating a module on multiple capabilities + a minimum
// language version.
//
// `requires` can be stacked — every clause must hold or the build
// aborts with `error[D0002]`. Common gates:
// - `requires backend.{vm,native,wasm}`
// - `requires platform.{posix,linux,macos,windows,wasm}`
// - `requires feature.{fs,net,process,signals,threads,gpu,...}`
// - `requires version >= 0.1` // monotonic, never expires
//
// See specs/enable-requires-directives.md for the full capability table.
requires version >= 0.1
requires feature.fs
requires feature.process
use std::fs
use std::process
fn main() {
// Reaching this line guarantees fs + process are available on the
// active target — no runtime fallback needed.
print("pid: {process.pid()}")
let cwd_ok = fs.exists(".")
print("cwd writable: {cwd_ok}")
}
// Try editing the file to add `requires backend.wasm` — building for
// the VM target should now fail with a clear diagnostic instead of
// crashing at runtime.
Desafío
Añade requires backend.wasm al archivo 02-platform-gating.zolo e intenta
compilar para el objetivo VM. ¿Qué aparece en el mensaje de error? ¿Qué
capability falta?
Consulta también