Scheme 模式匹配

Scheme 模式匹配,scheme,design-patterns,racket,matching,Scheme,Design Patterns,Racket,Matching,我编写了以下语法规则: (define-syntax match-rewriter (syntax-rules () ((_ (patt body) ...) (λ (x) (match x (patt body) ... (_ x)))))) 它本质上是match lambda,除非它在没有找到匹配项时返回其参数,而不是抛出异常 现在我想编写一个函数,let_as_lambda,它将源代码字符串作为输入,并将let语句重写为新的let_as_lambda函数。这就是

我编写了以下语法规则:

(define-syntax match-rewriter  
  (syntax-rules ()
    ((_ (patt body) ...)
     (λ (x) (match x (patt body) ... (_ x))))))
它本质上是
match lambda
,除非它在没有找到匹配项时返回其参数,而不是抛出异常

现在我想编写一个函数,
let_as_lambda
,它将源代码字符串作为输入,并将
let
语句重写为新的
let_as_lambda
函数。这就是我所拥有的:

(define let_as_lambda  
  (match-rewriter (`(let((,<var> ,<val>)) ... ,<expressions>)
                   `((lambda (,<var> ...) ,<expressions>) ,<val> ...))))
返回:

'((λ ((x) ...) (+ x 2)) (3) ...)
仍然显示椭圆和括号中的“3”。我认为我的问题是我不理解模式匹配中符号
`
的正确用法

如果有人能告诉我正确的方法,我将不胜感激


谢谢。

您可能会感到困惑,因为您使用了两种不同的模式匹配工具。第一个是通过
语法规则
得到的,第二个是
匹配
。它们看起来很接近,但有一些重要的区别——在本例中,主要问题是与
语法规则不同,您不能在
匹配的准引用结果中使用
..
。因此,要处理匹配值的列表,您需要使用
unquote拼接
(或
,@
)和其他功能,如
map
等。例如,比较这两个表达式的结果:

(match '(1 2 3) [`(,x ...) `(foo ,x ...)])
(match '(1 2 3) [`(,x ...) `(foo ,@x)])

顺便说一句,如果通常的
准引号
可以满足您的需求,那就太好了,但是要获得一个完整的解决方案,还需要使用简单的函数——这会使整个问题变得复杂(使用
将需要转换为
应用
)。

该死!我在写我的。你太快了,伊莱。你关于在Quasikote中添加“…”的可行性的评论也会让你的评论比我的好。正如我的学生所写:>O
(match '(1 2 3) [`(,x ...) `(foo ,x ...)])
(match '(1 2 3) [`(,x ...) `(foo ,@x)])