参考

原语

值、内存视图、所有权、布局和空值的语言与类型原语。

标量值

原语用途当前状态
Bool条件判断与逻辑结果。ifwhile 条件仅接受 Bool 类型。可运行
i8 i16 i32 i64有符号定宽整数。可运行
u8 u16 u32 u64无符号定宽整数。可运行
usize isize指针大小的整数。可运行
f32 f64浮点数值。可运行
char字节大小的字符值,用于 ASCII/解析器/编解码类工作。可运行
String字符串字面量和当前 I/O 示例所使用的文本值。可运行
Void不产生有用值的函数的返回类型。可运行

整数字面量支持十进制、十六进制、二进制、八进制、_ 分隔符,以及可选的后缀(如 _u8_usize)。

let count u32 0x12c_u32let byte u8 255let page usize 4_096

原语数值类型不会隐式收窄、拓宽或更改符号性。当转换是有意为之时,请使用显式类型转换。

let count u32 300let byte u8 count as u8let whole i32 7.9 as i32let marker u8 'A' as u8

缺失与可失败性

Maybe<T> 表示可选值。仅当期望类型已知为 Maybe<T> 时,才接受 null

let name Maybe<String> nulllet fallback name else "world"

可失败函数以 !![...] 标记,check 用于传播当前错误。可失败性是函数签名的一部分,而非运行时异常机制。

原生编译器接受用户定义可失败函数的显式错误集。

fn validate i32 ok Bool ![InvalidInput]  if == ok false    raise InvalidInput  ret 42 fn run Void ![InvalidInput]  check validate true

原生编译器将 Maybe<T> 上的 check 降低为针对第一个可恢复辅助切片的直接分支。Maybe 检查失败时返回函数的默认失败值,不涉及异常或展开。

用户定义的错误流仅当函数实际引发命名错误时,才会降低为小型状态/结果结构体。

内存与所有权

Zero 使内存布局在类型中可见。以下形式是原语类型构造器,因为它们影响所有权、借用、布局和清理。

原语用途
[N]T包含 NT 元素的固定大小数组。
Span<T>非拥有指针加长度。
ref<T>非拥有共享引用。
mutref<T>非拥有可变引用。
owned<T>仅可移动的值,拥有清理责任。
const TT 的只读视图。
type BufferView  bytes Span<u8>  owner Maybe<mutref<Alloc>> pub fn len usize view BufferView  ret std.mem.len view.bytes

Alloc 是分配 API 所使用的能力类型。堆分配应在函数参数和文档中可见;不存在隐藏的全局分配器。

分配器原语是显式句柄:

原语行为
NullAlloc始终报告分配失败,可用于证明某条路径不会进行分配。
FixedBufAlloc从调用者拥有的可变字节中分配,返回借用的 MutSpan<u8> 视图。
std.mem.arena(buffer)基于调用者存储的竞技场式固定缓冲区分配。
PageAlloc, GeneralAlloc显式句柄,非环境全局堆。
std.mem.byteBuf(alloc, len)返回由显式调用者存储支持的 Maybe<owned<ByteBuf>>

借用表达式创建引用时不涉及分配或运行时元数据。使用 &value 获取 ref<T>,使用 &mut value 获取 mutref<T>

fn read_x i32 point ref<Point>  ret point.x fn write_x Void point mutref<Point> value i32  set point.x value let shared &pointwrite_x (&mut point) 5

T 定义了规范的非抛出方法 fn drop Void self mutref<Self> 时,owned<T> 局部变量在词法作用域退出时自动清理。

清理被降低为直接调用,并且一旦拥有的绑定已被移动,清理即被跳过。

type Temp  bytes MutSpan<u8>   fn drop Void self mutref<Self>    set self.bytes[0] 0

布局原语

用户定义的类型不是原语,但某些布局标记是原语,因为它们定义了值如何跨越 ABI 或二进制边界。

形式用途
type默认 Zero 聚合布局。默认不保证 ABI 稳定性。
extern type针对所选目标的 C ABI 兼容聚合布局。
packed type具有声明字段宽度的位精确布局。
enum Name : uN具有显式整数底层类型的枚举。
choice带标签的选择值。要求穷尽匹配。
extern type CPoint  x i32  y i32 enum Color u8  red  green  blue

能力名称不是原语

WorldFsNetEnvArgsClockRandProc 等名称是能力接口。

它们是 Zero 效果模型的基础,但它们不是与 Boolu32Maybe<T>Span<T> 同意义上的原语值。

pub fn main Void world World !  check world.out.write "hello\n"

当前原生状态

原生编译器当前支持:

  • 带检查的原语整数宽度和精确的 C 整数类型
  • 原语整数、浮点数和字节 char 之间的显式类型转换
  • 面向内存的泛型形式
  • Maybe<T> 和 span 视图的原生布局
  • 源码级 ref<T>mutref<T> 借用
  • owned<T> 的词法移动
  • 活跃拥有局部变量的直接 drop 清理调用
  • 编译器已知的 owned<File> 清理
  • 通过 NullAlloc、可变 FixedBufAllocByteBuf 进行的分配

这些所有权特性均不增加运行时所有权机制。

不属于当前原生状态的内容:

  • f16
  • Unicode 标量字符处理
  • 更完善的借用和别名分析
  • Arena 和通用分配器行为
  • 泛型容器的 drop 胶水代码
  • 跨目标 ABI 更穷尽的布局一致性