28 lines
1.3 KiB
Racket
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))))]))
|