Предоставить синтаксис-правило 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) ...]))
Другие вопросы по тегам