我正在尝试将模式匹配函数添加到现有的方案元循环评估器(这是作业),并且我对指令的措辞有点失落。我希望在这方面更有技巧的人可以帮助我解释这一点。
匹配的语法应如下所示:(match a ((p1 v1) (p2 v2) (p3 v3)))
它可以用来找到这样的长度:
(define length (lambda (x)
(match x (('() 0)
(('cons a b) (+ 1 (length b))))))
函数中的模式语言应包含数字常量,引用常量,变量和缺点。如果模式在没有找到匹配的情况下耗尽,则应该抛出错误。
我认为我理解了模式匹配的概念,但是在函数中以这种方式实现它让我有点失望。有人愿意解释上面的语法是做什么的(具体来说,上面的长度如何使用匹配)所以我可以更好地理解这个函数应该做什么?
答案 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>
如果您实际将其作为一个函数实现(而不是作为宏(即源转换)),那么您需要准确指定如何使用环境等。