ZZust

Syntax

Rust 的结构感,脚本的修改速度

Zust 源文件使用 `.zs` 后缀。它支持函数、结构体、impl、泛型、闭包、导入、模式绑定、表达式控制流和动态 map/list,并允许变量直接重新赋值。

pub fn demo() {
    let p = Point{x: 3.0, y: 4.0};
    let scale = |value: f64| {
        value * 2.0
    };
    scale(p.len2())
}

函数与返回值

函数默认返回最后一个表达式。提前退出可以使用 `return`,这让短脚本保持简洁,也让复杂路径仍然清楚。

fn add(a: i64, b: i64) {
    a + b
}

pub fn main() {
    let value = add(40, 2);
    if value == 42 {
        return "answer";
    }
    "other"
}

基本值与字面量

数字可以带显式类型后缀;字符串支持转义和 raw string;list、map、tuple 可以直接作为脚本数据结构使用。

let i = 42i32;
let f = 3.14f32;
let raw = r#"hello "Zust""#;
let pair = (1i32, 2i32);
let list = [1, 2, 3];
let object = {name: "Zust", version: 0.9};

模式与修改

`let` 支持 tuple、list、标识符和通配符模式。变量、字段和索引可以直接重新赋值,复合赋值运算符也可用。

let (left, right) = (3i32, 4i32);
let [first, second] = [5i32, 6i32];
let _ = first;

let data = {items: [1i32, 2i32, 3i32]};
data.items.push(4i32);
data.items[0] = second + left + right;

表达式控制流

`if`/`else` 可以作为表达式,`for` 支持 open range 和 inclusive range,`while` 与 `loop` 覆盖更普通的循环场景。

let label = if list.len() > 0 { "non-empty" } else { "empty" };

let total = 0i32;
for idx in 0..10 {
    if idx % 2 == 0 {
        continue;
    }
    total += idx;
}

结构体与 impl

结构体让脚本拥有可维护的数据形状,`impl` 把行为放回类型旁边。方法调用和关联调用都支持。

struct Point {
    x: f64,
    y: f64,
}

impl Point {
    pub fn len2(self: Point) {
        self.x * self.x + self.y * self.y
    }
}

let p = Point{x: 3.0, y: 4.0};
p.len2() == Point::len2(p)

泛型与编译期参数

泛型能表达普通容器,也能表达固定数组长度和 BigFloat limb 数量这类编译期结构。

pub struct Boxed<T> {
    value: T,
}

pub struct BigFloat<N> {
    sign: bool,
    exp: i32,
    data: [u32; N],
}

闭包

闭包可以捕获外部值,适合在脚本内组织轻量变换和回调逻辑。

let base = 10i32;
let add_base = |value: i32| {
    value + base
};

add_base(5i32)

导入与模块

`import` 让 `.zs` 文件可以拆分。单参数导入会默认补全 `.zs` 后缀,适合小脚本模块化。

import("qsort", "qsort.zs");
import("syntax_imported");

let value = syntax_imported::imported_add(5i32, 6i32);