Требуется комбинация ~seq
и ...+
.
(define-syntax-parser #%app
[(_ {~seq Value1 {~datum +}} ...+ Value2)
#'(+ Value1 ... Value2)]
[(_ Xs ...)
#'(racket:#%app Xs ...)])
Совпадения ~seq
последовательность вещей без , требующая сгруппировать их в скобки, как это сделал ваш обходной путь.
...+
- это шаблон повторения, соответствующий одному или нескольким вещи, в отличие от нуля или более. Это гарантирует, что (f)
не будет случайно интерпретирован как (+ f)
.
Еще одно примечание, когда вы определяете #%app
напрямую, в отличие от определения под другим именем и затем переименования экспорта Вы должны быть особенно осторожны с неявным рекурсивным использованием. Например, (+ + x)
- это бесконечный l oop. Чтобы исправить это, вы можете использовать racket:#%app
в обоих выходах, например #'(racket:#%app + Value1 ... Value2)
.
(define-syntax-parser #%app
[(_ {~seq Value1 {~datum +}} ...+ Value2)
#'(racket:#%app + Value1 ... Value2)]
[(_ Xs ...)
#'(racket:#%app Xs ...)])