generic-syntax-expanders/private/define-expanders.rkt
2016-07-30 14:38:56 -07:00

28 lines
1.3 KiB
Racket

#lang racket
(require (for-syntax syntax/parse
"expander-types.rkt"
"expanders.rkt"
"with-identifiers.rkt"))
(provide define-expander-type)
(define-syntax define-expander-type
(syntax-parser
[(_ name:id)
(with-derived-ids #'name ([?-expander-type "~a-expander-type"]
[make-?-expander "make-~a-expander"]
[?-expander? "~a-expander?"]
[define-?-expander "define-~a-expander"]
[expand-all-?-expanders "expand-all-~a-expanders"])
#'(begin
(define-for-syntax ?-expander-type (make-expander-type))
(define-for-syntax (make-?-expander transformer)
(expander ?-expander-type transformer))
(define-for-syntax (?-expander? v)
(expander-of-type? ?-expander-type v))
(define-syntax-rule (define-?-expander expander-name transformer)
(define-syntax expander-name (make-?-expander transformer)))
(define-for-syntax (expand-all-?-expanders stx)
(expand-syntax-tree-with-expanders-of-type ?-expander-type stx))))]))