Skip to content

管道算子 |> 设计稿(讨论稿,2026-09-02) ​

定位:语言核心·专题设计(无章号)。动机与决策链:Plan 514 W3 调研 (KNOWN-DEBT P514-W3-1)→ 用户裁定移除换行流式链糖(commit 9264344cf, 句首 . 语句不再续接、旧形态报错)→ 多行链式调用需要显式替代语法。 本稿供讨论定稿,实施前需一次全语料词法冲突扫描。

1. 语法 ​

二元中缀算子 |>,首版只做方法形:

auto
// 脱糖前                          // 脱糖后(宿主 parser 层)
expr |> .m(args)                   expr.m(args)
expr |> .m(args) |> .n()           expr.m(args).n()    // 左结合

多行形态(本设计的核心目的——显式续行,无歧义):

auto
let res = http.request("POST", url)
    |> .header("Content-Type", "application/json")
    |> .timeout(5000)
    |> .send()

行中形态同样合法(x |> .m() 单行),但不是存在理由。

函数形(二期,待真实用例再立项):expr |> f(a, b) ≡ f(expr, a, b)。 首版不做——方法形已覆盖被移除链糖的全部用例,函数形引入"首参注入"语义 争议(placeholder 形 f(_, a)?尾参形?),不值得抢跑。

2. 词法 ​

新两字符 token |>(VBar 紧邻 Gt,贪婪匹配,镜像 ??/.?/..= 先例)。

冲突盘点(实施时须以全语料扫描证实零误伤):

  • | 现役:is-臂 or-模式("a" | "b" ->,g02 语料依赖)、按位或。 | > 相邻仅在 x | > y 形下出现——or-臂后接比较的形态在语料中 不存在,扫描确认即可。
  • > 现役:比较。a |> b 不会与 a > b 混淆(两字符整体识别)。

3. 语法与优先级 ​

  • 优先级:低于比较、高于赋值(a |> .m() == b 解析为 (a.m()) == b; 与赋值同区但右结合性不适用)。
  • 右操作数:按"原子 + 调用/字段/下标后缀链"解析,不吃低优先级二元。
  • 左结合;左操作数任意表达式(含上一个 |> 的结果)。

4. 脱糖层位与三后端 ​

宿主 parser 脱糖为 Expr::Call(Dot(lhs, m), args)——AST 层零新节点:

  • VM / 主 a2r:直接执行/发射既有方法调用形态,零新增路径。
  • AA2R(a2r.at):token 层自解析,需在其 pratt 镜像同一脱糖 (含行首 |> 续行);corpus_a2r 对拍覆盖对齐。

5. 兼容与迁移 ​

  • 与已移除链糖的关系:替代者;9264344cf 的报错文案 ("多行管道算子设计中")在本算子落地时更新为指向 |>。
  • 与 ?? / .? 家族风格一致:短符号、脱糖语义、无类型系统介入。

6. 测试计划(实施时) ​

99_idiom2 探针增件(单行/多行/嵌套链/行首形态);corpus_a2r 增 g16_pipe_basic;aavm2 compile corpus 自然覆盖(lib 不使用则不阻塞)。

7. 未决问题 ​

  1. |> .field(字段投影形,≡ expr.field)是否允许?倾向允许(零成本)。
  2. |> 在 is-臂 / 闭包体内是否合法?倾向闭包体合法、is-臂内不建议。
  3. 函数形最终形态与时机(二期)。
  4. 错误信息措辞更新(§5)随实施。

基于 MIT 许可发布。