Мне нужно иметь возможность сопоставлять такие шаблоны:
(lambda (<param> ...) <stmt> ...)
используя match-лямбда, и верните что-то вроде этого:
(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.
Если кто-нибудь может дать мне несколько советов о том, как исправить этот шаблон, я был бы очень признателен.
Спасибо.