add replace-context to syntax/strip-context

svn: r14196
This commit is contained in:
Matthew Flatt 2009-03-20 17:20:04 +00:00
parent 7dc8e077ed
commit 91c53fa123
2 changed files with 18 additions and 8 deletions

View File

@ -10,3 +10,9 @@
Removes all lexical context from @scheme[stx], preserving Removes all lexical context from @scheme[stx], preserving
source-location information and properties.} source-location information and properties.}
@defproc[(replace-context [ctx-stx syntax?] [stx syntax?]) syntax?]{
Uses the lexical context of @scheme[ctx-stx] to replace the lexical
context of all parts of @scheme[stx], preserving source-location
information and properties of @scheme[stx].}

View File

@ -1,23 +1,27 @@
#lang scheme/base #lang scheme/base
(provide strip-context) (provide strip-context
replace-context)
(define (strip-context e) (define (strip-context e)
(replace-context #f e))
(define (replace-context ctx e)
(cond (cond
[(syntax? e) [(syntax? e)
(datum->syntax #f (datum->syntax ctx
(strip-context (syntax-e e)) (replace-context ctx (syntax-e e))
e e
e)] e)]
[(pair? e) (cons (strip-context (car e)) [(pair? e) (cons (replace-context ctx (car e))
(strip-context (cdr e)))] (replace-context ctx (cdr e)))]
[(vector? e) (list->vector [(vector? e) (list->vector
(map strip-context (map (lambda (e) (replace-context ctx e))
(vector->list e)))] (vector->list e)))]
[(box? e) (box (strip-context (unbox e)))] [(box? e) (box (replace-context ctx (unbox e)))]
[(prefab-struct-key e) [(prefab-struct-key e)
=> (lambda (k) => (lambda (k)
(apply make-prefab-struct (apply make-prefab-struct
k k
(strip-context (cdr (vector->list (struct->vector e))))))] (replace-context ctx (cdr (vector->list (struct->vector e))))))]
[else e])) [else e]))