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 模式种类

  1. 常量模式
match x {
    0 => "zero",
    1 => "one",
    _ => "other"
}
  1. 变量绑定模式
match x {
    v => v + 1
}
  1. 结构解构模式(以向量为例)
match data {
    vec[a, b] => a + b,
    _ => 0
}
  1. 守卫模式
match x {
    v if v > 0 => "pos",
    v if v < 0 => "neg",
    _ => "zero"
}
  1. 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 + 11 + x
  • 交换律感知不改写源 AST 的标准顺序

7. 错误与诊断

  • MissingWildcard: 开放类型 match 缺失 _
  • UnreachablePattern: 分支被前序覆盖
  • PatternTypeMismatch: 模式与目标类型不兼容
  • MatchBranchTypeMismatch: 分支返回类型无法统一

8. 与其他 LSR 的关系

  • LSR-000:提供核心类型系统、表达式语义与返回类型统一规则
  • LSR-006:Lambda 规范来源
  • LSR-007:定义 === 的数学等价判定边界与化简策略