GNU Guile模式匹配:准引号下的...量词模式失效问题咨询
在Guile准引号模式中使用
...量词失败的原因及解决方法 问题原因
在Guile 3.0.10的(ice-9 match)模块中,准引号(quasi-quote)模式内不支持...(重复量词)语法,这并非你的使用方式错误,而是该场景下的特性尚未实现。
具体来说,当你使用((,a ,b ...)作为匹配模式时,Guile会将...当作普通符号处理,而非match的重复量词。这个模式实际匹配的是**仅包含两个元素的列表**:第一个元素绑定到a,第二个元素必须是符号b ...。而你的输入是三元列表(1 2 3),自然无法匹配,触发match-error`。
查看guile-3.0.10/module/ice-9/match.upstream.scm的源码也能验证这一点:准引号模式的解析逻辑仅处理简单的变量绑定和字面量匹配,没有针对...这类量词的特殊处理分支。
解决方法
1. 使用普通序列模式替代准引号
如果只是匹配任意序列的前n个元素加剩余部分,直接使用不带准引号的序列模式即可:
(use-modules (ice-9 match)) (match '(1 2 3) ((a b ...) b) )
执行后会返回预期结果(2 3)。
2. 匹配带字面量前缀的序列
如果需要匹配包含固定字面量前缀的列表(比如(foo 1 2 3)这类结构),可以使用准引号结合普通序列模式的写法,或者直接用非准引号的序列模式:
; 写法一:准引号结合序列模式 (match '(foo 1 2 3) (`(foo ,a ,b ...) b) ) ; 写法二:等价的非准引号模式(更推荐) (match '(foo 1 2 3) ((foo a b ...) b) )
两种写法都能正确匹配并返回(2 3)。
内容的提问来源于stack exchange,提问作者jcnn
相关产品推荐
相关产品推荐

