Improve code generated for segment variable matching in SYNTAX-RULES.
authorTaylor R. Campbell <net/mumble/campbell>
Wed, 27 Dec 2006 06:53:04 +0000 (06:53 +0000)
committerTaylor R. Campbell <net/mumble/campbell>
Wed, 27 Dec 2006 06:53:04 +0000 (06:53 +0000)
Before it used an idiom of

  ((LET ((LOOP #F)) (SET! LOOP (LAMBDA () ...)) LOOP)
   ...),

which caused spurious & confusing `Possible inapplicable operator #f'
warnings from the compiler's flow analyzer.  Now it uses

  ((LET () (DEFINE LOOP (LAMBDA () ...)) LOOP)
   ...),

like the code generated for named LET.

v7/src/runtime/syntax-rules.scm

index 17fedae9322088d7284803f60a52541114bbb940..1a636a53faeedaac6e6cf99563150b5100fe61c5 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: syntax-rules.scm,v 14.6 2003/03/07 21:13:29 cph Exp $
+$Id: syntax-rules.scm,v 14.7 2006/12/27 06:53:04 riastradh Exp $
 
 Copyright 1989,1990,1991,2001,2002,2003 Massachusetts Institute of Technology
 
@@ -155,21 +155,19 @@ USA.
                (r-l (rename 'L))
                (r-lambda (rename 'LAMBDA)))
            `(((,r-lambda
-               (,r-loop)
-               (,(rename 'BEGIN)
-                (,(rename 'SET!)
-                 ,r-loop
-                 (,r-lambda
-                  (,r-l)
-                  (,(rename 'IF)
-                   (,(rename 'NULL?) ,r-l)
-                   #T
-                   ,(conjunction
-                     `(,(rename 'PAIR?) ,r-l)
-                     (conjunction (loop pattern `(,(rename 'CAR) ,r-l))
-                                  `(,r-loop (,(rename 'CDR) ,r-l)))))))
-                ,r-loop))
-              #F)
+               ()
+               (,(rename 'DEFINE)
+                ,r-loop
+                (,r-lambda
+                 (,r-l)
+                 (,(rename 'IF)
+                  (,(rename 'NULL?) ,r-l)
+                  #T
+                  ,(conjunction
+                    `(,(rename 'PAIR?) ,r-l)
+                    (conjunction (loop pattern `(,(rename 'CAR) ,r-l))
+                                 `(,r-loop (,(rename 'CDR) ,r-l)))))))
+               ,r-loop))
              ,expression))))
        (conjunction
        (lambda (predicate consequent)
@@ -223,9 +221,7 @@ USA.
                          (error "illegal control/ellipsis combination"
                                 control sids))))
                 (syntax-error "Missing ellipsis in expansion." #f))
-            (loop control (cdr ellipses)))
-           ((pair? ellipses)
-            (syntax-error "Extra ellipsis in expansion." #f))))))
+            (loop control (cdr ellipses)))))))
 
 (define (generate-ellipsis rename ellipsis body syntax-error)
   (let ((sids (ellipsis-sids ellipsis)))