Синтаксис правил сопоставления с образцом является жадным и не возвращается на тот же шаблон.head ...
соответствует (1 7 (2 4))
, но 34
не соответствует (x y)
и, следовательно, не удается.Если вы ожидаете только один элемент после того, как вы можете сделать это:
(define-syntax test
(syntax-rules ()
((_ (head ... (x y) last-element))
(syntax-error
'last-element
"last element is"))
((_ any ...)
(syntax-error "fallback"))))
Если вы пытаетесь получить ноль или более элементов после последнего списка из двух, вам нужно немного помассировать его, если вы все еще хотитеиспользуйте syntax-rules
:
(define-syntax test
(syntax-rules (build)
((_ build m post (x y) . tail)
(test build #t () . tail))
((_ build m (post ...) any . tail)
(test build m (post ... any) . tail))
((_ build #t post)
(syntax-error
'post
"tail is"))
((_ (head ...))
(test build #f () head ...))
((_ any ...)
(syntax-error "fallback"))))
Символ в шаблоне соответствует чему угодно.Вот почему шаблон для (x y)
должен идти первым, поскольку any
также соответствует (2 4)
.например.для (test (1 7 (2 4) 34 (3 4 5)))
сообщение будет (34 (3 4 5))
, поскольку ни один из этих элементов не соответствует (x y)
, но оба соответствуют any
.
Обратите внимание, что syntax-error
не является частью схемы.