Stale translation: the English source changed after this draft. Treat the English edition as the authority.

Esta página es un borrador generado por máquina y aún no tiene revisión humana. Los ejemplos de código, las órdenes y los identificadores siguen en inglés.

Módulos, FFI y recursos#

Un módulo es un límite de visibilidad y de seguridad. El código nuevo debe usar module, un alias y nombres públicos calificados.

Importar un módulo#

module "modules/std/mathx/mathx.nano" as mathx

fn bounded(value: int) -> int {
    return (mathx.mathx_clamp value 0 100)
}

shadow bounded {
    assert (== (bounded -5) 0)
    assert (== (bounded 120) 100)
}

El analizador aún acepta las formas heredadas import y from ... import .... No las elijas para código nuevo.

Visibilidad#

Las declaraciones son privadas por defecto. Marca la superficie prevista con pub:

fn internal_scale(value: int) -> int {
    return (* value 2)
}

pub fn transform(value: int) -> int {
    return (+ (internal_scale value) 1)
}

Los ayudantes privados siguen siendo invocables dentro de su módulo. Los importadores solo pueden llamar declaraciones públicas.

Funciones extranjeras#

Las declaraciones extranjeras usan extern fn. Una llamada directa exige unsafe salvo que el módulo importado entero sea unsafe:

extern fn c_close(fd: int) -> int

fn close_fd(fd: int) -> int {
    unsafe {
        return (c_close fd)
    }
}

Mantén las regiones inseguras estrechas. Valida los valores extranjeros en el límite y expón un envoltorio tipado cuando se pueda ofrecer con honestidad.

Tipos de recurso#

resource struct marca un recurso afín que debe consumirse a lo sumo una vez:

resource struct FileHandle {
    fd: int
}

Mi comprobador de recursos detecta casos importantes de uso tras consumo y de consumo repetido. No es una demostración completa de propiedad. Anota los locales de recurso de forma explícita e inspecciona cada camino de retorno para la limpieza.

Metadatos de módulo#

Tres archivos sirven trabajos distintos:

FilePurpose
.nanoFuente y declaraciones públicas
module.jsonFuentes de compilación nativa, flags, paquetes y metadatos de propiedad
module.manifest.jsonMetadatos de descubrimiento, estabilidad, capacidades y ejemplos

Los módulos puros no siempre necesitan metadatos de compilación nativa. Consulta el module inventory generado para lo que existe ahora.