anchor.diff:  ;;; effectively the same as:
   ;;;
   ;;;    (VALUES (BUTLAST LIST (- (LENGTH LIST) N)
  -;;;            (LAST    LIST (- (LENGTH LIST) N)))
  +;;;            (COPY-LIST (LAST LIST (- (LENGTH LIST) N))))
   ;;;
   ;;; but a bit more efficient, visiting each cell exactly once. If the FROM-END
   ;;; argument is supplied and is non-NIL, it is equivalent to:
   ;;;
   ;;;    (VALUES (BUTLAST LIST N
  -;;;            (LAST    LIST N))
  +;;;            (COPY-LIST (LAST LIST N)))
   ;;;
   ;;; but again, probably faster. See also NSPLIT-LIST.
   (defun split-list (list &optional (n 1) &key from-end)
     (declare (type list list)
  -           (type (integer 0) n))
  +           (type (integer 0 #.most-positive-fixnum) n))
     (if from-end
         (loop
            for head-cursor on list
            for tail-cursor on (nthcdr n list)
            collecting (car head-cursor) into first-list
  -         when (not (consp (cdr tail-cursor)))
  -         do (return (values first-list
  -                            (copy-list (cdr head-cursor)))))
  +         finally (return (values first-list
  +                                 (copy-list head-cursor))))
         (loop
            for head-cursor on list
            for i from 1 to n
  
positive.code: ;;; The mutating, non-consing version of SPLIT-LIST.
  (defun nsplit-list (list &optional (n 1) &key from-end)
    (declare (type list list)
             (type (integer 0) n))
    (labels ((split-front (list n) ;; Break off and return the second list
               (if (zerop n)
                   list
  
negative.code: ;;;
  ;;;; Operations on lists. Where possible, both modifying and non-modifying
  ;;;; versions are given.
  ;;;
  ;;;; FIXME: SPLIT-LIST and NSPLIT-LIST take a non-negative FIXNUM as their
  ;;;; length argument. This improves the code generated by SBCL significantly,
  ;;;; but is it the right thing to do? (INTEGER 0 MOST-POSITIVE-FIXNUM) should
  ;;;; probably be given a proper name either way.
  
  (in-package :sj-lisp)
  
  