我需要能够匹配这样的模式:
(lambda (<param> ...) <stmt> ...)
使用match-lambda并返回如下内容:
(CLOSURE ENV '(<param> ...) (λ (ENV) <stmt> ...)
引用参数列表。
我能得到的最接近的是:
(`(lambda (,<param> . ,<params>) . ,<stmts>)
`(CLOSURE ENV (,<param> . <params>) (lambda (ENV) (,@<stmts>))))
例如,'(lambda(ls1 ls2)(追加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。
如果有人能就如何修复这种模式给我一些建议,我们将不胜感激。
感谢。
答案 0 :(得分:1)
您需要将'
字面上放入输出中。使用quasiquote
时这可能很棘手,所以我会在答案中避免这种情况。这是您想要的模式和右侧:
[`(lambda (,<param> . ,<params>) . ,<stmts>)
(list 'CLOSURE 'ENV (list 'quote (cons <param> <params>))
(list 'lambda '(ENV) <stmts>))]