Схема: синтаксическая ошибка совпадения лямбда - PullRequest
1 голос
/ 27 февраля 2011

Я пишу функцию аннотирования, которая часто использует match-lambda с рекурсивными вызовами для аннотирования. Вот один из шаблонов и совпадений:

(`(,<param> . ,<params> (lambda (,<args>) ,<stmt> . ,<stmts>))
 `(CLOSURE ENV ,(append (append `(,<param>) `(,<params>))`(,<args>)) (lambda (ENV) ,(map annotate `(,<stmt> . ,<stmts>)))))

Я получаю жалобу, что первое использование "." незаконно - между «param» и «params» - но я не могу понять, почему. Этот шаблон и совпадение не вызывают никаких нареканий и очень похожи на первый ".":

(`(λ (,<param1> . ,<params>) ,<stmt> . ,<stmts>)
 `(CLOSURE ENV ,(map annotate `(,<param1> . ,<params>)) (λ (ENV) ,(map annotate `(,<stmt> . ,<stmts>)))))

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

Спасибо.

1 Ответ

1 голос
/ 27 февраля 2011

. должен быть перед последним элементом в списке (за исключением некоторого специфичного для Racket синтаксиса, который вы не используете).Помните, что общая форма списка (a b c . d), что означает (cons a (cons b (cons c d))).Возможно, вы сможете использовать ,@<params> для сопоставления некоторых элементов в середине списка, но я не уверен в этом.

...