Как сопоставить шаблон 'letrec'
Я пытаюсь сделать сопоставление вызовов в letrec с помощью match-lambda. Мне кажется, что эта картина:
(match-lambda
(`(letrec ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
`(<match>))
должны соответствовать вызовам вида:
(letrec ((<var> <val>) ...) <expr> ...)
Но, конечно, это не работает.
Любой совет приветствуется.
2 ответа
Я думаю, что вам нужно использовать ...
синтаксис в match-lambda
:
(match-lambda
(`(letrec ((,<var> ,<val>) ...) ,<expr> ...)
body))
Я не уверен, но я думаю, что проблема может быть с ((,<var> ,<val>) . (,<vars> ,<vals>))
, Это идентично ((,<var> ,<val>) ,<vars> ,<vals>)
что не то, что вы хотите. Возможно, попробовать что-то вроде ((,<var> ,<val>) . ,<vars-vals>))
?
Я также посмотрел в документации, и кажется, letrec
не должно быть частью вашего выражения, и вы, возможно, должны использовать match-lambda*
,
Пытаться
(match-lambda
(`(((,<var> ,<val>) . ,<vars-vals>) ,<expr> . ,<exprs>)
`(<match>)))
(хотя, конечно, я могу ошибаться)