模式匹配支持guard

就像rescript里的一样

+1,非常实用的功能。

未来有计划支持,除了 guard 还有更强大的模式匹配,比如 F# 的 active pattern

冒昧询问一下预计在什么时候支持 :grinning:

有个问题是,guard 里可能有副作用,然后这是会破坏模式匹配优化的。比如下面这个例子:

fn main {
  let r = { val: 1 }
  match r {
    { val: 1 } if { r.val = 2; false } => println("1")
    { val: 2 } => println("2")
    _ => println("3")
  }
}

这段代码如果按逐行检查的语义应该输出 2,但如果对模式匹配做最基本的优化(避免重复判断)的话就会输出 2。有 pattern guard 的语言比如 OCaml 在这个问题都不能幸免,结果基本都是错的。最近 icfp24 似乎有一篇论文讨论如何解决这个问题,我们打算观望一下看能不能把 corner case 也搞对

感觉可以效仿rust禁止显式assign或者一旦检测到就退出优化来回避问题
先让语法本身落地会比较好,能用guard解决的问题非得拆成好几个函数会让移植代码变得困难 :grinning:

1 个赞