宏与 FFI 现状(1.7.0-dev / v4.38)
English summary. Macros are declarative and expand before parsing into ordinary syntax (no runtime objects/opcodes; VM/AOT identical). M1-lite: repetition, fragment classes, hygiene v2; single-level repetition, no $crate/path hygiene, no M2/procedure macros. FFI is controlled extern "C" with a small VM shim table (puts/strlen), scalar/borrowed strings; unknown externs and non-C ABIs are loud; AOT has no shim table → loud build failure.
宏 M1-lite(1.3.0-dev 起)
声明式、parse 前展开的宏;1.3 起的 M1-lite 扩展:
- 重复:
$(...)*/$(...)+/$(...)?,可选分隔符,/;;单层重复(嵌套重复 loud 未支持); - 片段分类:
expr/stmt/ident/ty/pat/path/literal/block; 不匹配 → rc=2,诊断含期望类别/参数序号/调用点行/宏声明行; - 卫生 v2:宏体引入的
let绑定按展开独立 gensym,不捕获调用者同名绑定;参数 call-site 解析; - 限制:递归 64 / nesting 96 / token 预算 500000 / 宏表 256 / 变参元素 65500,越界 loud;
$crate/路径卫生、M2 多规则 matcher、M3 过程宏未实现; - 展开在 token 流完成,不产生运行时对象/opcode,VM/AOT 行为一致(宏擦除)。
macro arr($($x: expr),*) { [$( $x ),*] }
macro each_out($($x: expr),*) { $( print($x); )* }
fn main() -> i32 {
let a: i32[3] = arr!(1, 2, 3)
print(a[0] + a[1] + a[2])
print(" ")
each_out!(4, 5, 6)
print("\n")
return 0
}
FFI:受控 extern "C"
- 仅
extern "C"ABI;VM 侧白名单 shim(puts/strlen); - 参数仅标量 + 只读 string 借用;不传 struct/数组/裸指针;callee 不得保存/释放 string; 未知 extern 名称 → 加载期 loud;其他 ABI 编译期错误;
- AOT:无 shim table → 构建期 loud(
AOT_UNSUPPORTED_BUILTIN,rc=5,无 ELF); - 无 unsafe 块/回调/线程语义/异常传播。
Modules B(1.4.x)
1.4.x 已并入 Modules B Phase2.1 + bugfix:原生 module map、pkg.mod::name 限定路径(单层)、 enum variant 路径、TC16/TC17 可读诊断。不是完整模块 B/2.0:类型深度上限 8、source map 仅诊断用、跨模块同名非 pub 需手工唯一化(同名 loud)、AOT-native 模块 2.0 未做、qpm 完整集成未做。
不得宣称
- 不得称完整模块 B / 模块生态 / 2.0 已实现;
- 不得称宏支持嵌套重复 /
$crate/ M2 / 过程宏; - 不得称任意 C FFI 或 AOT FFI;AOT FFI 一律 loud;
- 不得称这些能力已发布(1.7.0-dev 为 release candidate,NOT PUBLISHED)。