31 lines
1.3 KiB
Racket
31 lines
1.3 KiB
Racket
#lang racket/base
|
|
(require (for-syntax racket/base) racket/stxparam racket/splicing)
|
|
(provide splicing-syntax-parameterize
|
|
define-syntax-parameters
|
|
define-language-variables
|
|
inject-language-variables
|
|
(rename-out [br:define-syntax-parameter define-syntax-parameter]))
|
|
|
|
(define-syntax (br:define-syntax-parameter stx)
|
|
(syntax-case stx ()
|
|
[(_ ID STX)
|
|
#'(define-syntax-parameter ID STX)]
|
|
[(_ ID)
|
|
#'(define-syntax-parameter ID (λ (stx)
|
|
(raise-syntax-error (syntax-e stx) "parameter not set")))]))
|
|
|
|
(define-syntax-rule (define-syntax-parameters ID ...)
|
|
(begin (br:define-syntax-parameter ID) ...))
|
|
|
|
(define-syntax define-language-variables (make-rename-transformer #'define-syntax-parameters))
|
|
|
|
(define-syntax (inject-language-variables stx)
|
|
(syntax-case stx ()
|
|
[(_ ([VAR-PARAM INITIAL-VALUE] ...) LANG-CODE ...)
|
|
(with-syntax ([(INTERNAL-NAME ...) (generate-temporaries #'(VAR-PARAM ...))])
|
|
#'(splicing-syntax-parameterize ;; need to use splicing version in a module-begin to compose with requires etc. that might be in lang code
|
|
([VAR-PARAM (make-rename-transformer #'INTERNAL-NAME)] ...)
|
|
(define INTERNAL-NAME INITIAL-VALUE) ...
|
|
(provide (rename-out [INTERNAL-NAME VAR-PARAM] ...))
|
|
LANG-CODE ...))]))
|