From 8043768b4c706b30dde9a74570441915121bc142 Mon Sep 17 00:00:00 2001 From: shhyou Date: Thu, 29 Nov 2018 14:47:25 -0600 Subject: [PATCH] Support unsyntax-splicing in vector quasisyntax If the sub-template inside #(...) is unsyntax-splicing instead of list, produce the template #((~@! . ????)) instead of calling (datum->syntax o list->vector o syntax->list). Fixes #2402. --- pkgs/racket-test-core/tests/racket/stx.rktl | 3 ++- racket/collects/racket/private/qqstx.rkt | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/stx.rktl b/pkgs/racket-test-core/tests/racket/stx.rktl index 00904451a1..c765bc1ebd 100644 --- a/pkgs/racket-test-core/tests/racket/stx.rktl +++ b/pkgs/racket-test-core/tests/racket/stx.rktl @@ -2289,8 +2289,9 @@ (test '#(1 2 3 4 5) syntax->datum (quasisyntax #(a (unsyntax b) c ...))) (test '#s(PS 1 2) syntax->datum (quasisyntax #s(PS a (unsyntax b)))) (test '#s(PS 1 2 3 4 5) syntax->datum (quasisyntax #s(PS a (unsyntax b) c ...))) - #| (test '#(1 2 3 4 5) syntax->datum (quasisyntax #(a (unsyntax b) (unsyntax-splicing ds)))) + (test '#(3 4 5) syntax->datum (quasisyntax #((unsyntax-splicing ds)))) + #| (test '#s(PS 1 2 3 4 5) syntax->datum (quasisyntax #s(PS a (unsyntax b) (unsyntax-splicing ds)))) |#)) diff --git a/racket/collects/racket/private/qqstx.rkt b/racket/collects/racket/private/qqstx.rkt index 57bb2626de..c0f1bd0290 100644 --- a/racket/collects/racket/private/qqstx.rkt +++ b/racket/collects/racket/private/qqstx.rkt @@ -241,12 +241,15 @@ depth same-k (lambda (v bindings) - (convert-k (datum->syntax - stx - (list->vector (syntax->list v)) - stx - stx) - bindings)))] + (let ([stx-lst/#f (syntax->list v)]) + (convert-k (datum->syntax + stx + (if stx-lst/#f + (list->vector stx-lst/#f) + (vector-immutable (cons #'~@! v))) + stx + stx) + bindings))))] [(prefab-struct-key (syntax-e stx)) (let* ([d (syntax-e stx)] [key (prefab-struct-key d)]