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,而是让生成出来的代码可以继续被人读、被工具分析、被运行时接住。