1.0.7.5: allow WITH-INTERRUPTS inside "system locked" sections
[sbcl.git] / src / code / list.lisp
index b328681..5f38f71 100644 (file)
 (defun last1 (list)
   #!+sb-doc
   "Return the last cons (not the last element) of a list"
 (defun last1 (list)
   #!+sb-doc
   "Return the last cons (not the last element) of a list"
-  (let ((rest list))
+  (let ((rest list)
+        (list list))
     (loop (unless (consp rest) (return list))
           (shiftf list rest (cdr rest)))))
 
     (loop (unless (consp rest) (return list))
           (shiftf list rest (cdr rest)))))
 
   (declare (type index size))
   (do ((count size (1- count))
        (result '() (cons initial-element result)))
   (declare (type index size))
   (do ((count size (1- count))
        (result '() (cons initial-element result)))
-      ((zerop count) result)
+      ((<= count 0) result)
     (declare (type index count))))
 \f
 (defun append (&rest lists)
     (declare (type index count))))
 \f
 (defun append (&rest lists)
                  ((endp elements))
                (let ((ele (car elements)))
                  (typecase ele
                  ((endp elements))
                (let ((ele (car elements)))
                  (typecase ele
-                   (cons (rplacd (last1 splice) ele)
+                   (cons (rplacd (last splice) ele)
                          (setf splice ele))
                          (setf splice ele))
-                   (null (rplacd (last1 splice) nil))
+                   (null (rplacd (last splice) nil))
                    (atom (if (cdr elements)
                              (fail ele)
                    (atom (if (cdr elements)
                              (fail ele)
-                             (rplacd (last1 splice) ele)))
+                             (rplacd (last splice) ele)))
                    (t (fail ele)))))
              (return result)))
           (null)
                    (t (fail ele)))))
              (return result)))
           (null)
           (setf (car l) (cdar l)))
         (setq res (apply fun (nreverse args)))
         (case accumulate
           (setf (car l) (cdar l)))
         (setq res (apply fun (nreverse args)))
         (case accumulate
-          (:nconc (setq temp (last1 (nconc temp res))))
+          (:nconc (setq temp (last (nconc temp res))))
           (:list (rplacd temp (list res))
                  (setq temp (cdr temp))))))))
 
           (:list (rplacd temp (list res))
                  (setq temp (cdr temp))))))))