LSR 005 - 模式匹配
基本信息
- LSR 编号 005
- 标题 模式匹配
- 作者 Ziyang-Bai
- 状态 草案
- 类型 标准规范
- 创建日期 04-05-2026
- 归属项目 编译器、通用
摘要
定义 match 的语法、模式系统、穷尽检查、类型规则与求值顺序。match 为表达式,支持常量、解构、守卫与 Expr 匹配。
技术规范
1. 设计目标
- 提供可组合、可推导、可穷尽检查的分支表达式
- 控制
if-else嵌套深度,提升分支组合性 - 支持符号计算场景的 AST 结构匹配
2. 语法
2.1 基础语法
match target {
pattern1 [if guard1] => expr1,
pattern2 [if guard2] => expr2,
_ => default_expr
}
规则:
target求值一次- 分支按书写顺序匹配,首个命中分支立即返回
_是通配符,必须放在最后一个分支
2.2 模式种类
- 常量模式
match x {
0 => "zero",
1 => "one",
_ => "other"
}
- 变量绑定模式
match x {
v => v + 1
}
- 结构解构模式(以向量为例)
match data {
vec[a, b] => a + b,
_ => 0
}
- 守卫模式
match x {
v if v > 0 => "pos",
v if v < 0 => "neg",
_ => "zero"
}
- Expr 结构匹配(CAS)
func derivative(expr Expr, var Expr) -> Expr {
return match expr {
v if v === var => 1,
u^n if type(n) == num => n * u^(n-1) * derivative(u, var),
sin(u) => cos(u) * derivative(u, var),
f + g => derivative(f, var) + derivative(g, var),
c if type(c) == num => 0,
_ => 0
}
}
3. 穷尽检查与可达性
3.1 穷尽检查
target为有限可枚举类型时,必须覆盖全部分支或给出_- 当
target类型是开放类型(如num,text,Expr,vector,table)时,必须存在_分支
3.2 可达性检查
- 若某分支被前序分支完全覆盖,编译器报
UnreachablePattern - 分支顺序规则:
_作为最后一个分支
4. 类型规则
4.1 目标与模式类型一致性
- 模式必须与
target类型可统一 - 统一性为必需条件,失败时报
PatternTypeMismatch
4.2 分支返回类型
- 所有分支表达式返回类型必须一致,或满足 LSR-000 数值塔提升规则
- 无法统一时报
MatchBranchTypeMismatch
4.3 绑定变量作用域
- 模式内新绑定变量仅在对应分支可见
- 守卫表达式可访问该分支绑定变量
5. 求值与副作用规则
target仅求值一次- 仅执行首个命中分支的右侧表达式
- 执行范围:仅命中分支的右侧表达式参与求值
6. Expr 匹配特化规则
===用于数学等价判断,仅限Expr,其判定语义与化简边界由 LSR-007 定义- 对交换律节点(如加法)可启用交换律感知匹配:
f + g可匹配x + 1与1 + x - 交换律感知不改写源 AST 的标准顺序
7. 错误与诊断
MissingWildcard: 开放类型 match 缺失_UnreachablePattern: 分支被前序覆盖PatternTypeMismatch: 模式与目标类型不兼容MatchBranchTypeMismatch: 分支返回类型无法统一
8. 与其他 LSR 的关系
- LSR-000:提供核心类型系统、表达式语义与返回类型统一规则
- LSR-006:Lambda 规范来源
- LSR-007:定义
===的数学等价判定边界与化简策略