diff --git a/pkgs/racket-test-core/tests/racket/stxparam.rktl b/pkgs/racket-test-core/tests/racket/stxparam.rktl index b8daa79546..179adf31dc 100644 --- a/pkgs/racket-test-core/tests/racket/stxparam.rktl +++ b/pkgs/racket-test-core/tests/racket/stxparam.rktl @@ -139,6 +139,7 @@ #`#,(syntax-local-value #'t)])) (define-syntax one 1) (define-syntax two 2) + (define-syntax three 3) (define-rename-transformer-parameter num (make-rename-transformer #'one)) (test #t = (slv num) 1) @@ -146,7 +147,11 @@ (test #t = (slv num) 2)) (splicing-syntax-parameterize ([num (make-rename-transformer #'two)]) (define too (slv num))) - (test #t = too 2)) + (test #t = too 2) + (splicing-syntax-parameterize ([num (make-rename-transformer #'two)]) + (splicing-syntax-parameterize ([num (make-rename-transformer #'three)]) + (define trois (slv num)))) + (test #t = trois 3)) ;; ---------------------------------------- diff --git a/racket/collects/racket/private/stxparamkey.rkt b/racket/collects/racket/private/stxparamkey.rkt index bbd82e118c..1faa3dc710 100644 --- a/racket/collects/racket/private/stxparamkey.rkt +++ b/racket/collects/racket/private/stxparamkey.rkt @@ -51,6 +51,22 @@ rt)]) sp)) + (define (syntax-parameter-local-value-pre id) + (define-values (rt* rt-target) (syntax-local-value/immediate id (λ () #f))) + (cond + [(not rt-target) + rt*] + [(syntax-parameter? rt*) + rt-target] + [(parameter-binding? rt*) + rt*] + [else + (syntax-parameter-local-value-pre rt-target)])) + + (define (syntax-parameter-local-value-for-parameter target) + (or (syntax-parameter-local-value-pre (syntax-local-get-shadower target #t)) + (syntax-parameter-local-value-pre target))) + (define (target-value target) (syntax-local-value (syntax-local-get-shadower target #t) (lambda () @@ -69,10 +85,10 @@ v)]) (if (wrapped-renamer? v) (wrapped-renamer-renamer v) - v))) + v))) (define (syntax-parameter-target-parameter target) - (let ([v (target-value target)]) + (let ([v (syntax-parameter-local-value-for-parameter target)]) (parameter-binding-param v))) (define (convert-renamer must-be-renamer?-stx v) diff --git a/racket/collects/racket/splicing.rkt b/racket/collects/racket/splicing.rkt index b911623deb..5096983a64 100644 --- a/racket/collects/racket/splicing.rkt +++ b/racket/collects/racket/splicing.rkt @@ -350,10 +350,7 @@ 'transparent)])) (define-for-syntax (parameter-of id) - (let* ([rt (syntax-local-value id)] - [sp (if (set!-transformer? rt) - (set!-transformer-procedure rt) - rt)]) + (let ([sp (syntax-parameter-local-value id)]) (syntax-parameter-target-parameter (syntax-parameter-target sp))))