racket/collects/drscheme/private/recon.rkt
2010-04-24 08:01:33 -05:00

20 lines
619 B
Racket

#lang racket/base
(require (for-syntax racket/base))
(provide reconstitute)
(begin-for-syntax
(define-struct sloc (inside loc) #:omit-define-syntaxes #:prefab))
(define-syntax (reconstitute orig-stx)
(syntax-case orig-stx ()
[(_ arg src)
(let loop ([stx #'arg])
(cond
[(syntax? stx) (datum->syntax stx (loop (syntax-e stx)))]
[(pair? stx) (cons (loop (car stx)) (loop (cdr stx)))]
[(sloc? stx)
(datum->syntax #'src
(loop (syntax-e (sloc-inside stx)))
(syntax->datum (sloc-loc stx)))]
[else stx]))]))