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