как сопоставить шаблон 'letrec' - PullRequest
0 голосов
/ 15 марта 2011

Я пытаюсь сопоставить вызовы совпадений с letrec, используя match-lambda. Мне кажется, что это шаблон:

(match-lambda
  (`(letrec ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
   `(<match>))

должно соответствовать вызовам вида:

(letrec ((<var> <val>) ...) <expr> ...)

Но, конечно, это не работает.

Любой совет приветствуется.

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Я думаю, вам нужно использовать синтаксис ... в match-lambda:

(match-lambda
  (`(letrec ((,<var> ,<val>) ...) ,<expr> ...)
    body))
0 голосов
/ 18 марта 2011

Я не уверен, но думаю, что проблема может быть в ((,<var> ,<val>) . (,<vars> ,<vals>)). Это идентично ((,<var> ,<val>) ,<vars> ,<vals>), что не то, что вы хотите. Может быть, попробовать что-то вроде ((,<var> ,<val>) . ,<vars-vals>))?


Я также изучил документацию , и кажется, что letrec не должно быть частью вашего выражения, и вы, возможно, должны использовать match-lambda*.

Попробуйте

(match-lambda
  (`(((,<var> ,<val>) . ,<vars-vals>) ,<expr> . ,<exprs>)
   `(<match>)))

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

...