0.7.9.55:
authorChristophe Rhodes <csr21@cam.ac.uk>
Tue, 19 Nov 2002 00:42:29 +0000 (00:42 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Tue, 19 Nov 2002 00:42:29 +0000 (00:42 +0000)
Fix some more LOOP compliance issues
... signal a package error if the package doesn't exist
... the loop block should surround variable initialization
forms

src/code/loop.lisp
src/code/package.lisp
tests/loop.pure.lisp
version.lisp-expr

index d6e83a9..59504a9 100644 (file)
@@ -800,9 +800,6 @@ code to be loaded.
                     ,(nreverse *loop-after-body*)
                     ,(nreconc *loop-epilogue*
                               (nreverse *loop-after-epilogue*)))))
-      (do () (nil)
-       (setq answer `(block ,(pop *loop-names*) ,answer))
-       (unless *loop-names* (return nil)))
       (dolist (entry *loop-bind-stack*)
        (let ((vars (first entry))
              (dcls (second entry))
@@ -818,6 +815,9 @@ code to be loaded.
                             ,vars
                             ,@(loop-build-destructuring-bindings crocks
                                                                  forms)))))))
+      (do () (nil)
+       (setq answer `(block ,(pop *loop-names*) ,answer))
+       (unless *loop-names* (return nil)))
       answer)))
 
 (defun loop-iteration-driver ()
index e376b9d..9d47baf 100644 (file)
            (,packages `,(mapcar (lambda (package)
                                   (if (packagep package)
                                       package
-                                      (find-package package)))
+                                      ;; Maybe FIND-PACKAGE-OR-DIE?
+                                      (or (find-package package)
+                                          (error 'simple-package-error
+                                                 ;; could be a character
+                                                 :name (string package)
+                                                 :format-control "~@<~S does not name a package ~:>"
+                                                 :format-arguments (list package)))))
                                 (if (consp ,these-packages)
                                     ,these-packages
                                     (list ,these-packages))))
            `(setf ,package-use-list (package-%use-list (car ,packages)))
            `(declare (ignore ,package-use-list)))
        (macrolet ((,init-macro (next-kind)
+        (declare (optimize (inhibit-warnings 3)))
         (let ((symbols (gensym)))
           `(progn
              (setf ,',kind ,next-kind)
           (flet ((,real-symbol-p (number)
                    (> number 1)))
             (macrolet ((,mname ()
+             (declare (optimize (inhibit-warnings 3)))
              `(block ,',BLOCK
                 (loop
                   (case ,',kind
index bed64e1..73c45e3 100644 (file)
 
 (let ((*package* (find-package :cl)))
   (assert (= (loop for x being each external-symbol count t) 978)))
+
+(assert (eq (loop for a = (return t) return nil) t))
+
+(multiple-value-bind (result error)
+    (ignore-errors
+      (loop for nil being the external-symbols of :nonexistent-package
+           count t))
+  (assert (null result))
+  (assert (typep error 'package-error)))
index cbc55fc..9be2bff 100644 (file)
@@ -18,4 +18,4 @@
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
 
-"0.7.9.54"
+"0.7.9.55"