Схема / Ракетка: синтаксический синтаксический анализатор запутан - PullRequest
0 голосов
/ 13 февраля 2020

Этот код работает нормально:

(require syntax/parse/define (only-in racket [#%app racket:#%app]))
(define-syntax-parser #%app
    [(_ Cond {~datum ?} Form1 ...) 
    #'(when Cond Form1 ...)]
    [(_ Cond {~datum ??} Form1 ... {~datum :} Form2 ...) 
    #'(if Cond (begin Form1 ...) (begin Form2 ...))]
    [(_ Xs ...) 
    #'(racket:#%app Xs ...)]
)

(#t ? (displayln 1))
(#t ?? (displayln 1) : (displayln 2))

Однако я могу sh изменить ?? на один ?. Racket показывает ошибку, почему Racket не соответствует второму синтаксису?

:: undefined;
 cannot reference an identifier before its definition

Не смешивает ли Racket синтаксис if с приведенным выше синтаксисом when? Как это исправить, чтобы использовать один и тот же ? для when и if?

1 Ответ

0 голосов
/ 13 февраля 2020

Я узнал, как, 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))
...