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

本页是机器生成的草稿,尚未经人工审校。代码示例、命令和标识符保持英文。

模块、FFI 与资源#

模块是可见性与安全边界。新代码应使用 module、别名,以及限定的公开名字。

导入模块#

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)
}

解析器仍接受旧式 import 和 from ... import ... 形式。不要为新代码选择它们。

可见性#

声明默认私有。用 pub 标出打算公开的表面:

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

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

私有辅助函数在其模块内仍可调用。导入方只能调用公开声明。

外部函数#

外部声明使用 extern fn。直接调用需要 unsafe,除非整个被导入模块是 unsafe:

extern fn c_close(fd: int) -> int

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

把不安全区域保持狭窄。在边界上校验外部值,并在能够诚实提供时暴露带类型的包装。

资源类型#

resource struct 标记一个仿射资源,最多应被消费一次:

resource struct FileHandle {
    fd: int
}

我的资源检查器会检测重要的消费后使用和重复消费情况。它不是完整的所有权证明。显式注解资源局部变量,并检查每条返回路径上的清理。

模块元数据#

三个文件承担不同工作:

FilePurpose
.nano源码与公开声明
module.json原生构建源、标志、包和所有权元数据
module.manifest.json发现元数据、稳定性、能力和示例

纯模块并不总需要原生构建元数据。现有内容见生成的 module inventory。