倒数第二个条件语句 - Tony Finch

大约半年前,作者遇到一篇名为“终极条件语法”的论文。其目标是将模式匹配与布尔条件测试统一,解决方案在某些方面很出色,但作者认为过于复杂。

  • 什么是 UCS?:“终极条件语法”做了几件相互关联且相互支持的事情,包括“表达式 is 模式”运算符可在布尔表达式中进行模式匹配,能“拆分”测试以避免重复部分,缩进语法减少标点符号需求,还可在拆分间插入 let 绑定。
  • UCS 的由来:传统函数式编程语言的模式匹配支持嵌套模式,可消除冗余测试,但 UCS 引入了更多导致冗余检查的原因,拆分用于在源级别减少冗余代码,主要原因是将 is 运算符视为双向测试,次要原因是表达式导向的函数式语言不喜欢提前返回。
  • 超出范围:作者认为 UCS 的缩进语法会使程序员更易犯错,编译器产生错误消息更困难,试图寻找一种类似“is 模式”运算符的 Rust 语言,但无法解决模式中变量绑定的作用域问题,后来发现解决方案是将 thenelse 嵌套在条件表达式中。
  • 倒数第二个条件:有两个要素,一是 thenelse 变为导致提前从条件表达式返回的运算符,可降为类似 Rust 的语法;二是用于多向模式匹配的 is 运算符,其绑定的变量作用域涵盖表达式的后续部分。评估模型类似熟悉的短路逻辑,且不需要单独的语法来处理 as 模式。
  • 悬空语法is 运算符的优先级和结合性很棘手,有两种悬空-else 问题,通过使用花括号 {} 来消除歧义,is 运算符的绑定优先级也有规定。
  • 示例:将“终极条件语法”论文中的大多数示例翻译为倒数第二个条件语法,包括各种模式匹配和条件判断的示例,展示了其在不同情况下的应用。
  • 倒数第三个思考:作者开始写这些笔记时,倒数第二个条件语法只是一个想法的草图,经过实践后认为其比预期更好,虽然多向匹配括号的额外嵌套似乎不那么笨重,但示例中没有 bulky 的 thenelse 块,其与 Rust 的 match 类似,|| 行较嘈杂,作者对其处理方式也有思考。
阅读 11
0 条评论