Как сопоставить шаблон '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>)))

(хотя, конечно, я могу ошибаться)

Другие вопросы по тегам