如何为准引用DSL的引用模式添加非线性模式支持?
我最近终于给自己实现的准引用(quasi-quoted)DSL补上了非线性模式(Non linear patterns)的支持!现在终于能写出eval [expr| $a + $a|] = 2 * eval a这种代码了——这里重复的$a会自动断言两次匹配的内容相等,完全符合非线性模式的预期。
核心实现思路:修改antiExprPat
我的核心修改集中在antiExprPat这个组件上,逻辑其实挺直观的:
- 处理反引用名称
s时,先用lookupValueName检查它是否已经在当前作用域内 - 如果不在作用域:就创建一个同名的绑定器,和常规模式绑定的逻辑一致
- 如果已经在作用域:就生成一个视图模式
(== s) -> ...,强制后续匹配的内容必须和之前绑定的s的值相等
这么改完之后,非线性模式的核心需求就完全满足了:第一次出现的绑定器负责绑定对应的值,后续重复出现的同名绑定器会自动转化为相等性检查,完美实现了非线性模式的断言效果。
内容的提问来源于stack exchange,提问作者rem
相关产品推荐
相关产品推荐

