我需要能够匹配这样的模式:

(lambda (<param> ...) <stmt> ...)

使用match-lambda并返回如下内容:
(CLOSURE ENV '(<param> ...) (λ (ENV) <stmt> ...)

引用参数列表的位置。

我能得到的最接近的是:
(`(lambda (,<param> . ,<params>) . ,<stmts>)
 `(CLOSURE ENV (,<param> . <params>) (lambda (ENV) (,@<stmts>))))

例如,'(lambda(ls1 ls2)(append ls1 ls2)))返回:
'(CLOSURE
  ENV
  (ls1 ls2)
  (lambda (ENV) ((append ls1 ls2))))

但我无法得到要引用的参数列表。

在回答以前的帖子时,我被告知“。”模式中的,必须在列表中的最后一个元素之前。但是我发现这是不正确的。例如:
(define function-call
  (match-rewriter
   (`(,<func> . ,<args>)
    `(CALL ,<func> (list ,@<args>)))) (+ 1 2) )

返回:
'(CALL + (list 1 2))

args明显匹配1和2。

如果有人可以给我一些有关如何解决此问题的建议,将不胜感激。

谢谢。

最佳答案

您需要按原样将'放入输出中。使用quasiquote时,这可能会很棘手,因此我将在回答中避免这种情况。这是您想要的样式和右侧:

[`(lambda (,<param> . ,<params>) . ,<stmts>)
 (list 'CLOSURE 'ENV (list 'quote (cons <param> <params>))
       (list 'lambda '(ENV) <stmts>))]

关于scheme - 方案: pattern matching syntax,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5217905/

10-12 21:39