flow 声明块¶
flow 是 Link 的声明式数据流定义语法,用于把"数据源 → 变换 → 消费"组织成一条可读的管道。
基本语法¶
flow FlowName "可选描述" {
source: <expr>;
sample: every 1s; // 可选,v0.1 解析但忽略
pipeline:
<pipeline expr>;
}
flow后跟名称(必填)- 名称后可选字符串字面量作为描述
source:字段可选,其表达式求值后绑定到子作用域中的source变量sample:字段可选,v0.1 仅解析不执行(时间调度规划在 Phase 1.8)pipeline:字段必填,通常是一条|管道链
最简示例¶
fn double(x: i32) -> i32 { return x * 2; }
flow DoubleAll {
source: stream([1, 2, 3]);
pipeline:
source | map(double) | collect;
}
执行后返回 [2, 4, 6]。
字段说明¶
source¶
source: 字段为 flow 提供数据源,其值会绑定到子作用域中的 source 变量,供 pipeline 引用:
source 字段可省略,此时 pipeline 内可以直接内联 stream 表达式:
sample¶
sample: 字段用于声明采样策略(如 every 1s)。v0.1 解释器暂未实现时间调度,该字段会被解析但不影响执行:
flow Sampled {
source: stream([100, 200, 300]);
sample: every 1s;
pipeline:
source | for_each(print_val);
}
时间调度与异步执行规划在 Phase 1.8(异步运行时)中实现。
pipeline¶
pipeline: 是 flow 的核心,定义数据如何变换和消费。它通常是一条由 | 连接的管道链:
flow SquareEvens "平方偶数" {
source: stream([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
pipeline:
source | filter(is_even) | map(square) | collect;
}
stream(list)—— 从列表创建流map(fn)—— 元素变换filter(fn)—— 过滤for_each(fn)—— 遍历消费(返回 none)collect—— 收集为列表
执行语义¶
v0.1 是树漫游解释器,没有真正的并发调度。flow 块的当前执行语义:
- 遇到
flow声明时**立即执行**(不是声明后注册等待调用) - 为 flow 创建独立子作用域,
source变量不会泄露到外部 - 若有
source:字段,求值后绑定到source - 求值
pipeline:表达式,其返回值作为整个 flow 块的返回值 - 多个 flow 按源码出现顺序串行执行
flow First {
source: stream([1, 2]);
pipeline: source | map(double) | collect; // [2, 4]
}
flow Second {
source: stream([1, 2]);
pipeline: source | map(triple) | collect; // [3, 6]
}
// 最终返回 Second 的结果 [3, 6]
未来 Phase 1.8 引入异步运行时后,多个 flow 将自动并行调度。
作用域隔离¶
source 变量只在 flow 块内部可见,不会污染外部作用域:
flow F {
source: stream([1, 2, 3]);
pipeline: source | collect;
}
// 此处引用 source 会报错:Undefined variable: source
println(source); // Error
完整示例¶
fn double(x: i32) -> i32 { return x * 2; }
fn is_even(x: i32) -> bool { return x % 2 == 0; }
fn square(x: i32) -> i32 { return x * x; }
fn greet(name: str) { println("hello, " + name); }
fn print_val(v: i32) { println(v); }
// for_each 消费流
flow HelloFlow "问候流" {
source: stream(["alice", "bob", "charlie"]);
pipeline:
source | for_each(greet);
}
// map + filter + collect 链式处理
flow SquareEvens "平方偶数" {
source: stream([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
pipeline:
source | filter(is_even) | map(square) | collect;
}
// 无 source,pipeline 内联 stream
flow InlineFlow {
pipeline:
stream([1, 2, 3]) | map(double) | collect;
}
输出:
当前限制¶
v0.1 的 flow 实现有以下限制,后续版本会改进:
- 不支持
sample: every 1s时间调度(Phase 1.8) - 不支持跨 flow 引用(如
flow B { pipeline: A.output | ... }) - 不支持
window/aggregate/sink等高级算子 - 不支持闭包字面量
filter(x) { x > 0 },需先声明具名函数 - 多个 flow 串行执行,无并行调度