~ chicken-core (chicken-5) f825d98b52599bfd2c6048e23d144d2629a630df


commit f825d98b52599bfd2c6048e23d144d2629a630df
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Sun Apr 22 13:34:34 2012 +0200
Commit:     Jim Ursetto <zbigniewsz@gmail.com>
CommitDate: Sun Apr 22 17:43:44 2012 -0500

    Fix DSSSL key arg handling in the presence of optional and rest args. Reported on IRC by R. Winkler
    
    Signed-off-by: Jim Ursetto <zbigniewsz@gmail.com>

diff --git a/expand.scm b/expand.scm
index 401234d6..e523a0cf 100644
--- a/expand.scm
+++ b/expand.scm
@@ -359,7 +359,7 @@
 				,(map (lambda (k)
 					(let ([s (car k)])
 					  `(,s (##sys#get-keyword
-						(##core#quote ,(->keyword (##sys#strip-syntax s))) ,rvar
+						(##core#quote ,(->keyword (##sys#strip-syntax s))) ,(or hasrest rvar)
 						,@(if (pair? (cdr k)) 
 						      `((,%lambda () ,@(cdr k)))
 						      '())))))
diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm
index c1a2fa8f..17d533d9 100644
--- a/tests/syntax-tests.scm
+++ b/tests/syntax-tests.scm
@@ -764,6 +764,33 @@
 
 (assert (string=? "hello, XXX" (bar who: "XXX")))
 
+;;; DSSSL keyword arguments in various combinations with optional and rest args
+;;; reported on IRC by R. Winkler
+
+(define (test-optional&rest x y #!optional z #!rest r)
+  (list x y z r))
+
+(assert (equal? '(3 4 5 (6 7)) (test-optional&rest 3 4 5 6 7)))
+
+(define (test-optional&key x y #!optional z #!key i (j 1))
+  (list x y z i: i j: j))
+
+(assert (equal? '(3 4 5 i: 6 j: 7) (test-optional&key 3 4 5 i: 6 j: 7 8)))
+;; Unfortunate but correct (missing optional arg)
+(assert (equal? '(3 4 i: i: #f j: 1) (test-optional&key 3 4 i: 6 j: 7 8)))
+
+(define (test-key&rest x y #!rest r #!key i (j 1))
+  (list x y i: i j: j r))
+
+(assert (equal? '(3 4 i: 5 j: 1 (i: 5 6 7)) (test-key&rest 3 4 i: 5 6 7)))
+(assert (equal? '(3 4 i: 5 j: 6 (i: 5 j: 6 7 8))
+                (test-key&rest 3 4 i: 5 j: 6 7 8)))
+
+(define (test-optional-key&rest x y #!optional z #!rest r #!key i (j 1))
+  (list x y z i: i j: j r))
+
+(assert (equal? '(3 4 5 i: 6 j: 7 (i: 6 j: 7 8))
+                (test-optional-key&rest 3 4 5 i: 6 j: 7 8)))
 
 ;;; import not seen, if explicitly exported and renamed:
 
Trap