racket/collects/syntax/stx.rkt

31 lines
929 B
Racket

#lang racket/base
;; These utilities facilitate operations on syntax objects.
;; A syntax object that represents a parenthesized sequence
;; can contain a mixture of cons cells and syntax objects,
;; hence the need for `stx-null?', `stx-car', etc.
(require racket/private/stx)
(provide
;; from racket/private/stx
stx-null? stx-pair? stx-list?
stx-car stx-cdr stx->list
;; defined here
stx-map module-or-top-identifier=?)
(define (stx-map f . stxls)
(for ([stxl (in-list stxls)]
[i (in-naturals)])
(unless (stx-list? stxl)
(apply raise-type-error 'stx-map "stx-list" i stxls)))
(apply map f (map stx->list stxls)))
(define (module-or-top-identifier=? a b)
(or (free-identifier=? a b)
(and (eq? (syntax-e a) (syntax-e b))
(free-identifier=? a
(datum->syntax
#f
(syntax-e b))))))