我需要能够像这样匹配模式:
(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。
如果有人能给我一些关于如何修复这个模式的建议,我将不胜感激。
谢谢。
发布于 2011-03-07 21:30:39
您需要将'直接放入输出中。在使用quasiquote时,这可能很棘手,因此我将在回答中避免这种情况。这是你想要的模式和右边:
[`(lambda (,<param> . ,<params>) . ,<stmts>)
(list 'CLOSURE 'ENV (list 'quote (cons <param> <params>))
(list 'lambda '(ENV) <stmts>))]https://stackoverflow.com/questions/5217905
复制相似问题