Я узнал, как, when
определяется первым перед if
в define-syntax-parser
, и его синтаксис включает в себя многоточие ...
, которое соответствует всему, что следует за ним, включая :
в if-else.
Исправлено, как показано ниже, сначала поставьте синтаксис для if
:
(require syntax/parse/define (only-in racket [#%app racket:#%app]))
(define-syntax-parser #%app
[(_ Cond {~datum ?} Form1 ... {~datum :} Form2 ...)
#'(if Cond (begin Form1 ...) (begin Form2 ...))]
[(_ Cond {~datum ?} Form1 ...)
#'(when Cond Form1 ...)]
[(_ Xs ...)
#'(racket:#%app Xs ...)]
)
(#t ? (displayln 1))
(#t ? (displayln 1) : (displayln 2))