Scheme中使用了什么算法来进行语法情况下的模式匹配



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(中所注意到的,更复杂和有趣的部分是用模式扩展模板,如上述论文中所述。

相关内容

最新更新