ZZust

Design

Zust 是给 AI 生成代码准备的可控运行层

它不是要完整复制 Rust,而是保留 Rust 最有结构感的部分:函数、块、结构体、impl、泛型和模块。然后把借用检查、显式 mut 等对脚本生成不友好的负担移开。

Zust Mandelbrot 螺旋渲染

AI 更容易写对

模型生成代码时,最怕目标语言既宽松到没有结构,又严格到错误集中在与业务无关的细节上。Zust 的折中是让语法保持 Rust 的轮廓,同时把变量修改、动态值和宿主边界做得更直接。

pub fn agent_task(ctx) {
    let plan = ctx.goal;
    let tools = root::get("local/tools");

    for step in plan.steps {
        let result = tools[step.tool](step.input);
        ctx.memory.push(result);
    }

    ctx.memory
}

Dynamic 作为边界

`Dynamic` 是 Zust 与宿主系统、JSON、MessagePack、工具调用结果之间的公共数据模型。脚本可以先以 map/list 的方式快速表达,等路径稳定后再把关键数据结构类型化。

  • map/list 适合承接 API 返回值和智能体上下文。
  • typed vector 适合跨过边界进入数值计算。
  • native/custom 对象适合在本地 VM 进程内携带宿主能力。

从脚本走向本地函数

Zust 脚本可以通过 VM 导入、编译,再把函数指针暴露给 Rust 宿主调用。这样一段 AI 生成的逻辑可以先被审查和热更新,稳定后进入真实执行链路。

let vm = vm::Vm::with_all()?;
vm.import_code("demo", source)?;

let compiled = vm.get_fn("demo::add", &[Type::I64, Type::I64])?;
let add: extern "C" fn(i64, i64) -> i64 =
    unsafe { std::mem::transmute(compiled.ptr()) };

语言形状

Zust 保留的是长期维护脚本最需要的语义骨架:模块、函数、结构体、方法、泛型、闭包和表达式控制流。它的目标不是一次性 DSL,而是让生成出来的代码可以继续被人读、被工具分析、被运行时接住。