From b1243c63d42b7155102318a510e66ad6d012dc34 Mon Sep 17 00:00:00 2001
From: Alex Shinn <alexshinn@gmail.com>
Date: Sat, 9 May 2015 21:20:21 +0900
Subject: [PATCH] Fixing bug in match for var extraction of quasiquote
 patterns.

---
 lib/chibi/match-test.sld  | 2 ++
 lib/chibi/match/match.scm | 9 +++++----
 2 files changed, 7 insertions(+), 4 deletions(-)

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))
     ))