R。Kent Dybvig在他的语法案例论文《Scheme中编写卫生宏》(第9页(中使用了这个例子来说明Scheme的模式匹配:
(define-syntax let1
(lambda (x)
(syntax-case x ()
((((i v) ...) e1 e2 ...)
(syntax ((lambda (i ...) e1 e2 ...) v ...))))))
我很好奇,匹配它的算法是什么?我知道存在不同的模式匹配算法,但在这里,考虑到模式的非常有限的性质(唯一标识符、非常简单的语法(,算法似乎需要非常简单,但我找不到任何更详细地描述它的参考文献。
在上面的例子中,e1 e2 ...
非常简单,因为它可以按原样匹配,也可以由子模式e2 ...
单独匹配(?(。部分((i v) ...)
更棘手,因为它既不直接匹配i ...
也不直接匹配v ...
,所以在这里它可以进行一些更复杂的匹配,或者只将其视为"匹配";另一个省略号";。
- 算法究竟是什么
- 我在哪里可以找到更多信息
我似乎已经在Erik Hilsdale和Daniel p.Friedman的论文《以连续传递风格编写宏》、Eugene E.Kohlbecker和Mitchell Wand的论文《示例中的宏》和R.Kent Dybvig的论文《句法抽象:句法大小写扩展器》中找到了答案。
我的错误是误解了...
的含义。我假设它是";以下任何内容";,而实际上CCD_ 7和CCD_;PATTERN和以下元素类似";。在这种情况下,e1 e2 ...
与一个或多个e[j]
对象的序列匹配,而(i v) ...
与一系列(i v)[j]
对匹配,因此如果我们滥用符号并在方括号中添加索引,则可以像i[j]...
和v[j]...
一样单独提取元素。
因此,匹配算法实际上相当简单:它按原样匹配文字,将对象与关键字匹配,匹配创建子模式(列表(的结构,但也有...
表示";最后一个图案可以重复";。正如mnemenaut在评论(+1(中所注意到的,更复杂和有趣的部分是用模式扩展模板,如上述论文中所述。