Предоставить синтаксис-правило Racket
Как мне предоставить синтаксические правила в ракетке?
У меня есть код, который похож на это:
(define-syntax SELECT
(syntax-rules (FROM WHERE star)
[(SELECT colnames FROM relnames)
...]
[(SELECT colnames FROM relnames WHERE . expression)
...]))
Как я могу использовать оператор предоставления для предоставления ОТ ГДЕ и звездочки?
Вот как я предоставляю SELECT:
(provide SELECT)
1 ответ
Решение
Вот один из способов сделать это. Сначала определите литералы (и дайте хорошие сообщения об ошибках, если они используются вне SELECT), затем предоставьте их.
#lang racket
(provide SELECT FROM WHERE)
(define-syntax FROM (λ (stx) (raise-syntax-error 'FROM "literal FROM used outside SELECT" stx)))
(define-syntax WHERE (λ (stx) (raise-syntax-error 'WHERE "literal WHERE used outside SELECT" stx)))
(define-syntax SELECT
(syntax-rules (FROM WHERE star)
[(SELECT colnames FROM relnames) ...]
[(SELECT colnames FROM relnames WHERE . expression) ...]))