LSR 005 - 模式匹配 ================================================================================ 基本信息 -------------------------------------------------------------------------------- - LSR 编号 005 - 标题 模式匹配 - 作者 Ziyang-Bai - 状态 草案 - 类型 标准规范 - 创建日期 04-05-2026 - 归属项目 编译器、通用 摘要 -------------------------------------------------------------------------------- 定义 ``match`` 的语法、模式系统、穷尽检查、类型规则与求值顺序。``match`` 为表达式,支持常量、解构、守卫与 ``Expr`` 匹配。 技术规范 -------------------------------------------------------------------------------- 1. 设计目标 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 提供可组合、可推导、可穷尽检查的分支表达式 - 控制 ``if-else`` 嵌套深度,提升分支组合性 - 支持符号计算场景的 AST 结构匹配 2. 语法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2.1 基础语法 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: text match target { pattern1 [if guard1] => expr1, pattern2 [if guard2] => expr2, _ => default_expr } 规则: - ``target`` 求值一次 - 分支按书写顺序匹配,首个命中分支立即返回 - ``_`` 是通配符,必须放在最后一个分支 2.2 模式种类 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. 常量模式 .. code-block:: text match x { 0 => "zero", 1 => "one", _ => "other" } 2. 变量绑定模式 .. code-block:: text match x { v => v + 1 } 3. 结构解构模式(以向量为例) .. code-block:: text match data { vec[a, b] => a + b, _ => 0 } 4. 守卫模式 .. code-block:: text match x { v if v > 0 => "pos", v if v < 0 => "neg", _ => "zero" } 5. Expr 结构匹配(CAS) .. code-block:: text 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:定义 ``===`` 的数学等价判定边界与化简策略