anchor.diff:  ;;; This implementation works according to the HyperSpec note
   ;;; when n is 0.
   
  -;;; FIXME: The HyperSpec says that we must signal a type-error
  -;;; for circular lists, but we currently don't. 
  -
   (defun butlast (list &optional (n 1))
     (unless (typep list 'list)
       (error 'must-be-list
  
positive.code:     (loop repeat n
  	  until (atom remaining)
  	  do (setf remaining (cdr remaining)))
      (loop until (atom remaining)
            do (setf remaining (cdr remaining))
            collect (prog1 (car list) (setf list (cdr list))))))
  
  ;;; There is probably no point in making a special version of 
  ;;; butlast for n = 1, because the time is going to be dominated
  
negative.code:       (let ((a list)
              (b (cdr list))
              (c (cddr list)))
          (loop for slow on list
  	      until (atom c)
                do (setf a b
                         b c
                         c (cdr c))
  	      until (atom c)
                do (setf a b
                         b c
                         c (cdr c))
  	      do (when (eq slow c)
  		   ;; we have a circular list
  		   (error 'must-be-proper-or-dotted-list
  			  :datum list
  			  :name 'nbutlast)))
  	(setf (cdr a) nil)
          list)))
  
  ;;; FIXME: The HyperSpec says that we must signal a type-error
  