diff --git a/lib/chibi/match-test.sld b/lib/chibi/match-test.sld index bf8532d3..6161fc50 100644 --- a/lib/chibi/match-test.sld +++ b/lib/chibi/match-test.sld @@ -33,6 +33,8 @@ (match '(ok . ok) ((x . 'bad) x) (('ok . x) x))) (test "duplicate symbols bound" 3 (let ((a '(1 2))) (match a ((and (a 2) (1 b)) (+ a b)) (_ #f)))) + (test "duplicate quasiquote" 'ok + (match '(a b) ((or `(a ,x) `(,x b)) 'ok) (_ #f))) (test "ellipses" '((a b c) (1 2 3)) (match '((a . 1) (b . 2) (c . 3)) diff --git a/lib/chibi/match/match.scm b/lib/chibi/match/match.scm index d3335bd6..4a5d038f 100644 --- a/lib/chibi/match/match.scm +++ b/lib/chibi/match/match.scm @@ -227,6 +227,7 @@ ;; performance can be found at ;; http://synthcode.com/scheme/match-cond-expand.scm ;; +;; 2015/05/09 - fixing bug in var extraction of quasiquote patterns ;; 2014/11/24 - adding Gauche's `@' pattern for named record field matching ;; 2012/12/26 - wrapping match-let&co body in lexical closure ;; 2012/11/28 - fixing typo s/vetor/vector in largely unused set! code @@ -808,13 +809,13 @@ (match-extract-vars x k i v)) ((match-extract-quasiquote-vars (unquote x) k i v (#t . d)) (match-extract-quasiquote-vars x k i v d)) - ((match-extract-quasiquote-vars (x . y) k i v (#t . d)) + ((match-extract-quasiquote-vars (x . y) k i v d) (match-extract-quasiquote-vars x - (match-extract-quasiquote-vars-step y k i v d) i ())) - ((match-extract-quasiquote-vars #(x ...) k i v (#t . d)) + (match-extract-quasiquote-vars-step y k i v d) i () d)) + ((match-extract-quasiquote-vars #(x ...) k i v d) (match-extract-quasiquote-vars (x ...) k i v d)) - ((match-extract-quasiquote-vars x (k ...) i v (#t . d)) + ((match-extract-quasiquote-vars x (k ...) i v d) (k ... v)) ))