Схема: синтаксическая ошибка совпадения лямбда - 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 и Scheme для представления «неправильных списков»; то есть последовательности пар минусов, которые не заканчиваются на «пусто». Так, например,

'(3 4 . 5)

является сокращением для

(cons 3 (cons 4 5))

«Точка» используется для обозначения: «Я закончил со спискообразной частью; вот окончательное значение, используйте это вместо« пусто ». По этой причине, вы не можете использовать точку нигде» в списке, это должно быть перед одним, последним элементом. В вашем примере точка в шаблоне предшествует группе элементов, а не только одному.

Глядя на ваш пример, похоже, что вы хотите использовать здесь синтаксис "...", например ::

(match '(a b c d e)
  [`(,x ... d e) 'ok])

(На самом деле, вы также можете использовать точки для обозначения инфикса в Racket, но я совершенно уверен, что это не то, что вы пытаетесь сделать здесь).

...