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