Scheme Meta Circular Evaluator中的模式匹配函数

时间:2015-02-25 19:16:17

标签: scheme pattern-matching racket metacircular

我正在尝试将模式匹配函数添加到现有的方案元循环评估器(这是作业),并且我对指令的措辞有点失落。我希望在这方面更有技巧的人可以帮助我解释这一点。

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

它可以用来找到这样的长度:

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

函数中的模式语言应包含数字常量,引用常量,变量和缺点。如果模式在没有找到匹配的情况下耗尽,则应该抛出错误。

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

2 个答案:

答案 0 :(得分:1)

我建议您阅读功能语言的实现中的第四章Structured Types and the Semantics of Pattern Matching。本章由Simon L. Peyton Jones和Philip Wadler撰写。

答案 1 :(得分: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 表单可能更容易。< / p>

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