删除 flow/chain/compose 语法关键词
本次删除 flow、chain、compose 三个英文语法关键词, 以及对应的中文语法关键词 顺流、衔接、复合, 并删除它们在两套编译器中的实现、测试、示例和文档。
对应提交:18e4cae56。
使用频率
删除前,受版本管理的 .meta 源码中, 真正把这些名字当语法关键词使用的只有 4 处:
flow:1 处,在package-load-fragments.meta中。chain:1 处,在030-module-analysis-pass.meta中。compose:2 处,分别在030-module-analysis-pass.meta和desugar-letrec.meta中。
其余出现的地方主要是:
- parser / formatter / pretty / traversal 的实现;
- desugar 实现;
- 测试、示例、文档和生成的 dump。
也就是说,真实调用点只有 4 个, 但为了支持它们,需要在两套编译器里维护三个独立的 AST 变体:
FlowExp/flow-expChainExp/chain-expComposeExp/compose-exp
并让它们在 parse、format、pretty、traverse、substitution、 location、occurred names、desugar 等路径中全部被处理。 维护成本明显高于当前收益。
为什么删除
- 它们是纯语法糖,表达能力可以被已有语法覆盖:
flow等价于嵌套函数作用;chain等价于(lambda (x) (flow x ...));compose等价于反方向的chain。
- 删除后只需要迁移 4 处真实调用,迁移成本可接受。
- 自举编译器(
meta-lisp.meta,WIP)可以少维护三个语法特性。 - 这符合
2025-10-08-variadic-function中的判断:只因为参数个数可变就定义为语法关键词,太小题大做。 - 也符合
2026-08-14-remove-define-struct-star的清理先例:没有足够证据证明特殊形式值得占用语言核心时,应优先删除。
迁移方式
4 处真实调用全部改成显式写法:
package-load-fragments.meta中的flow改为直接调用list-each。030-module-analysis-pass.meta中的compose改为显式lambda。030-module-analysis-pass.meta中的chain改为显式lambda。desugar-letrec.meta中的compose改为显式lambda。
普通函数示例 compose2 不是语法关键词实现,因此保留。