Parsing Scheme/Racket:如何在定义语法时重复

Parsing Scheme/Racket:如何在定义语法时重复,parsing,syntax,scheme,racket,definition,Parsing,Syntax,Scheme,Racket,Definition,我可以在Racket中定义中缀“+”,如下所示: (require syntax/parse/define (only-in racket (#%app racket:#%app))) (define-syntax-parser #%app [(_ Value1 {~datum +} Value2) #'(+ Value1 Value2)] [(_ Xs ...) #'(racket:#%app Xs ...)] ) (displayln (1 + 2)) 我想使用~bet

我可以在Racket中定义中缀“+”,如下所示:

(require syntax/parse/define (only-in racket (#%app racket:#%app)))
(define-syntax-parser #%app
  [(_ Value1 {~datum +} Value2)
  #'(+ Value1 Value2)]

  [(_ Xs ...) 
  #'(racket:#%app Xs ...)]
)
(displayln (1 + 2))
我想使用~between添加多个中缀“+”,但不起作用:

(require syntax/parse/define (only-in racket (#%app racket:#%app)))
(define-syntax-parser #%app
  [(_ {~between {Value1 {~datum +}} 1 100} Value2)
  #'(+ Value1 Value2)]

  [(_ Xs ...) 
  #'(racket:#%app Xs ...)]
)
(displayln (1 + 2))
Racket中的语法如下:with~between但no~ repeat

如何使用~between属性在语法中重复项

我有一个解决方案,但它看起来不是纯的多中缀+,需要将每个左项都用括号括起来:

(require syntax/parse/define (only-in racket (#%app racket:#%app)))
(define-syntax-parser #%app
  [(_ {Value1 {~datum +}} ... Value2)
  #'(+ Value1 ... Value2)]

  [(_ Xs ...) 
  #'(racket:#%app Xs ...)]
)
(displayln ({1 +} {2 +} 3))

您需要的是和的组合

匹配一系列内容,而不需要像您的解决方法那样使用括号对它们进行分组

是一种匹配一个或多个事物的重复模式,而不是零个或多个。这确保f不会意外地被解释为+f

还有一点需要注意,当您直接定义%app时,与使用其他名称定义然后重命名导出不同,您需要特别小心隐式递归使用。例如,++x是一个无限循环。要修复此问题,您可以在两个输出中使用racket:%app,如“racket:%app+Value1…”。。。价值2


您需要的是和的组合

匹配一系列内容,而不需要像您的解决方法那样使用括号对它们进行分组

是一种匹配一个或多个事物的重复模式,而不是零个或多个。这确保f不会意外地被解释为+f

还有一点需要注意,当您直接定义%app时,与使用其他名称定义然后重命名导出不同,您需要特别小心隐式递归使用。例如,++x是一个无限循环。要修复此问题,您可以在两个输出中使用racket:%app,如“racket:%app+Value1…”。。。价值2

(define-syntax-parser #%app
  [(_ {~seq Value1 {~datum +}} ...+ Value2)
   #'(+ Value1 ... Value2)]
  [(_ Xs ...) 
   #'(racket:#%app Xs ...)])
(define-syntax-parser #%app
  [(_ {~seq Value1 {~datum +}} ...+ Value2)
   #'(racket:#%app + Value1 ... Value2)]
  [(_ Xs ...) 
   #'(racket:#%app Xs ...)])