主要观点:
- 关于解析和美化打印进行讨论后,可能将相关内容集成到[Scrapscript]中。
- 有一些数学表达式需要以中缀形式打印,如
Add(Const(1), Mul(Const(2), Const(3)))
。 - 实现了一个
pretty
函数用于美化打印表达式,目前存在一些问题,如括号使用过多等。 - 通过定义操作符的优先级
PREC
和处理结合性,改进了pretty
函数,使其能更准确地打印表达式,且避免了一些不必要的括号。
关键信息:
- 定义了
Expr
、Const
、Binary
等类来表示表达式结构。 OPS
字典用于存储操作符及其对应的符号。pretty
函数通过匹配表达式类型进行不同的处理,递归调用自身处理子表达式。PREC
字典存储操作符的优先级、结合性等信息,用于决定是否添加括号。
重要细节:
- 对于加法和乘法,递归调用
pretty
时传递当前操作符的优先级减一。 - 对于左结合的减法和除法,递归调用
pretty
时对右子表达式保持相同的优先级。 - 对于右结合的指数运算,递归调用
pretty
时对右子表达式的优先级减一。 - River 为其 OCaml 中的简单类型 lambda 演算编译器写了一篇后续文章。
- 提到避免了如第二个 StackOverflow 答案中提到的“作弊”行为,即二进制操作符处理函数不再尝试自行添加括号。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。