你想要的是
~seq
和
...+
(define-syntax-parser #%app
[(_ {~seq Value1 {~datum +}} ...+ Value2)
#'(+ Value1 ... Value2)]
[(_ Xs ...)
#'(racket:#%app Xs ...)])
~序号
没有
要求他们按括号分组,就像你的解决方法一样。
...+
是一种重复模式来匹配一个或多个事物,而不是零个或多个。这样可以确保
(f)
不会被意外地解释为
(+ f)
.
#%app
直接地说,与在不同名称下定义然后重命名导出不同,您需要对隐式递归使用格外小心。例如
(+ + x)
racket:#%app
在两个输出中,比如
#'(racket:#%app + Value1 ... Value2)
(define-syntax-parser #%app
[(_ {~seq Value1 {~datum +}} ...+ Value2)
#'(racket:#%app + Value1 ... Value2)]
[(_ Xs ...)
#'(racket:#%app Xs ...)])