~ chicken-core (chicken-5) b504261ea6f46680661d296b2a42f52aa39b820f


commit b504261ea6f46680661d296b2a42f52aa39b820f
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Fri Dec 13 21:50:25 2013 +0100
Commit:     Christian Kellermann <ckeen@pestilenz.org>
CommitDate: Sat Dec 14 17:12:24 2013 +0100

    Fix #1080
    
    We now simply check whether an "else"-clause was generated before we
    generate a catchall else-clause.  It's a bit dirty, but it works...
    
    Signed-off-by: Christian Kellermann <ckeen@pestilenz.org>

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 112a0782..5e88bba4 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -884,23 +884,26 @@
 	  (%memv (r 'memv))
 	  (%else (r 'else)))
       (define (parse-clause c)
-	(let* ([var (and (symbol? (car c)) (car c))]
-	       [kinds (if var (cadr c) (car c))]
-	       [body (if var (cddr c) (cdr c))] )
+	(let* ((var (and (symbol? (car c)) (car c)))
+	       (kinds (if var (cadr c) (car c)))
+	       (body (if var
+			 `(##core#let ((,var ,exvar)) ,@(cddr c))
+			 `(##core#let () ,@(cdr c)))))
 	  (if (null? kinds)
-	      `(,%else 
-		,(if var
-		     `(##core#let ([,var ,exvar]) ,@body)
-		     `(##core#let () ,@body) ) )
-	      `((,%and ,kvar ,@(map (lambda (k) `(,%memv (##core#quote ,k) ,kvar)) kinds))
-		,(if var
-		     `(##core#let ([,var ,exvar]) ,@body)
-		     `(##core#let () ,@body) ) ) ) ) )
+	      `(,%else ,body)
+	      `((,%and ,kvar ,@(map (lambda (k)
+				      `(,%memv (##core#quote ,k) ,kvar)) kinds))
+		,body ) ) ) )
       `(,(r 'handle-exceptions) ,exvar
-	(##core#let ([,kvar (,%and (##sys#structure? ,exvar (##core#quote condition) )
-				   (##sys#slot ,exvar 1))])
-		    (,(r 'cond) ,@(map parse-clause (cddr form))
-		     (,%else (##sys#signal ,exvar)) ) )
+	(##core#let ((,kvar (,%and (##sys#structure? ,exvar
+						     (##core#quote condition))
+				   (##sys#slot ,exvar 1))))
+		    ,(let ((clauses (map parse-clause (cddr form))))
+		       `(,(r 'cond)
+			 ,@clauses
+			 ,@(if (assq %else clauses)
+			       `()   ; Don't generate two else clauses
+			       `((,%else (##sys#signal ,exvar)))) )) )
 	,(cadr form))))))
 
 
Trap