#lang racket/base (require (for-syntax racket/base syntax/parse) syntax/strip-context) (provide (all-defined-out) (all-from-out syntax/strip-context)) (define-syntax (syntax-match stx) (syntax-case stx (syntax) [(_ stx-arg [(syntax pattern) body ...] ...) #'(syntax-case stx-arg () [pattern body ...] ...)])) (define-syntax (add-syntax stx) ;; todo: permit mixing of two-arg and one-arg binding forms ;; one-arg form allows you to inject an existing syntax object using its current name (syntax-case stx (syntax) [(_ ([(syntax sid) sid-stx] ...) body ...) #'(with-syntax ([sid sid-stx] ...) body ...)] ;; todo: limit `sid` to be an identifier [(_ ([sid] ...) body ...) #'(with-syntax ([sid sid] ...) body ...)])) (define-syntax syntax-let (make-rename-transformer #'add-syntax)) (define-syntax inject-syntax (make-rename-transformer #'add-syntax)) (define-syntax (map-syntax stx) (syntax-case stx () [(_ ...) #'(map (if (and (syntax? ) (list? (syntax-e ))) (syntax->list ) ) ...)])) #;(define-syntax syntax-variable (make-rename-transformer #'format-id))