方案/球拍:如何在定义语法中重复

问题描述 投票:0回答:1

我可以在球拍中如下定义中缀'+':

(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中的语法在这里:https://docs.racket-lang.org/syntax/stxparse-patterns.html带有~between,但没有~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))
parsing syntax scheme racket definition
1个回答
0
投票

您想要的是~seq~seq的组合。

...+

...+匹配事物序列[[without,要求像解决方法那样将其用方括号分组。

(define-syntax-parser #%app [(_ {~seq Value1 {~datum +}} ...+ Value2) #'(+ Value1 Value2)] [(_ Xs ...) #'(racket:#%app Xs ...)]) 是一种重复模式,用于匹配一个或多个事物,而不是零个或多个事物。这样可以确保不会将~seq误认为是~seq
© www.soinside.com 2019 - 2024. All rights reserved.