Scheme 模式匹配语法

Scheme 模式匹配语法,scheme,pattern-matching,syntax-error,racket,Scheme,Pattern Matching,Syntax Error,Racket,我需要能够匹配如下模式: (lambda (<param> ...) <stmt> ...) (CLOSURE ENV '(<param> ...) (λ (ENV) <stmt> ...) 但我无法引用参数列表 在回答之前的帖子时,我被告知模式中的“.”必须位于列表中最后一个元素之前。然而,我发现这是不正确的。例如: (define function-call (match-rewriter (`(,<func> . ,

我需要能够匹配如下模式:

(lambda (<param> ...) <stmt> ...)
(CLOSURE ENV '(<param> ...) (λ (ENV) <stmt> ...)
但我无法引用参数列表

在回答之前的帖子时,我被告知模式中的“.”必须位于列表中最后一个元素之前。然而,我发现这是不正确的。例如:

(define function-call
  (match-rewriter
   (`(,<func> . ,<args>)
    `(CALL ,<func> (list ,@<args>)))) (+ 1 2) )
其中args已明确匹配1和2

如果有人能给我一些关于如何修复这种模式的建议,我将不胜感激


谢谢。

您需要将
逐字输入输出。在使用
quasikote
时,这可能会很棘手,因此我将在回答中避免这一点。这是您想要的图案和右侧:

[`(lambda (,<param> . ,<params>) . ,<stmts>)
 (list 'CLOSURE 'ENV (list 'quote (cons <param> <params>)) 
       (list 'lambda '(ENV) <stmts>))]
[`(λ(,,,),)
(列表“关闭”环境(列表“引用(cons))
(列出“lambda”(环境))]

Hiya;关于你(我)对点的位置的评论:重点是点必须在图案的最多一个元素之前,就像这里一样。哦,我明白了。谢谢你跟踪我。哦,谢谢。我想我必须在模式匹配中使用Quasikote,而自己插入引号对我来说毫无意义。
(define function-call
  (match-rewriter
   (`(,<func> . ,<args>)
    `(CALL ,<func> (list ,@<args>)))) (+ 1 2) )
'(CALL + (list 1 2))
[`(lambda (,<param> . ,<params>) . ,<stmts>)
 (list 'CLOSURE 'ENV (list 'quote (cons <param> <params>)) 
       (list 'lambda '(ENV) <stmts>))]