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:定义 === 的数学等价判定边界与化简策略