2

我正在尝试将模式匹配功能添加到现有方案元循环评估器(这是家庭作业),我对说明的措辞有点迷茫。我希望在这方面更熟练的人可以帮助我解释这一点。

match 的语法应如下所示:(match a ((p1 v1) (p2 v2) (p3 v3)))

它可以用来查找长度,如下所示:

(define length (lambda (x)
   (match x (('() 0)
             (('cons a b) (+ 1 (length b))))))

函数中的模式语言应包含数字常量、带引号的常量、变量和 cons。如果模式用尽但没有找到匹配项,则应抛出错误。

我以为我理解了模式匹配的概念,但是以这种方式在函数中实现它让我有点失望。有人愿意解释上面的语法在做什么(特别是上面的长度如何使用匹配),以便我可以更好地理解这个函数应该做什么?

4

2 回答 2

1

我建议你阅读函数式语言的实现中的第四章,结构化类型和模式匹配的语义。本章由 Simon L. Peyton Jones 和 Philip Wadler 撰写。

于 2015-02-25T19:49:42.780 回答
1
(match x (('() 0)
          (('cons a b) (+ 1 (length b)))))

考虑一下这段代码需要扩展成什么可能是最有帮助的。对于每个模式,您需要一个测试来确定您尝试匹配的对象是否匹配,并且您需要代码来确定如何将变量绑定到它的子部分。在这种情况下,您需要一个大致如下的扩展:

(if (equal? '() x)
    0
    (if (pair? x)
        (let ((a (car x))
              (b (cdr x)))
          (+ 1 (length b)))
        ;; indicate failure to match
        'NO-MATCH))

当然,您也可以使用cond来编写它,但是如果您必须在程序上扩展它,使用嵌套的if表单可能会更容易。

如果您实际上将其实现为函数(而不是宏(即源转换)),那么您需要准确指定如何使用环境等。

于 2015-02-25T21:59:18.467 回答